編輯:Android開發教程
SurfaceFlinger的啟動與工作原理
1.1.1 SurfaceFlinger的啟動
SurfaceFlinger的啟動和ServiceManager有點類似,它們都屬於系統的底層支撐服務,必需在設備開機的早期就運行起來。
/*frameworks/base/cmds/system_server/library/System_init.cpp*/
extern "C" status_t system_init()
{…
property_get("system_init.startsurfaceflinger", propBuf,"1");
if (strcmp(propBuf,"1") == 0) {
SurfaceFlinger::instantiate();
}…
這個System_init.cpp會被編譯到libsystem_server庫中,然後由SystemServer在JNI層進行加載調用,從而啟動包括SurfaceFlinger、SensorService等在內的系統服務。
和AudioFlinger/AudioPolicyService看到的情況一樣,它調用instantiate來創建一個binder server,名稱為“SurfaceFlinger”。而且強指針的特性讓它在第一次被引用時會調用onFirstRef:
void SurfaceFlinger::onFirstRef()
{
mEventQueue.init(this);//初始化事件隊列
run("SurfaceFlinger",PRIORITY_URGENT_DISPLAY);//啟動一個新的業務線程
mReadyToRunBarrier.wait();//等待新線程啟動完畢
}
成員變量mEventQueue是一個MessageQueue類型的對象,我們在進程章節已經詳細分析過消息隊列與Looper、Handler等類的使用,大家可以先回頭參考下(雖然Java層的這些類與SurfaceFlinger中用到的有一定差異,但其本質原理是一樣的)。既然有消息隊列,那就一定會有配套的事件處理器Handler以及循環體Looper,這些是在MessageQueue::init函數中創建的,即:
/*frameworks/native/services/surfaceflinger/MessageQueue.cpp*/
void MessageQueue::init(const sp<SurfaceFlinger>& flinger)
{
mFlinger = flinger;
mLooper = newLooper(true);
mHandler = newHandler(*this);
}
Android應用中的Activity指具有屏幕顯示支持用戶交互的基本模塊,類似於Java ME中的MIDlet, Windows 應用中的Form。 比如可以是撥號,發
package name是Android系統中為每一個應用程序分配的一個標識,每個應用的標識都必須是不同的。在應用開發過程中,有時候可能需要對package name進行
前面Android簡明開發教程一:概述簡要的介紹了Android平台,本篇說明如何安裝搭建Android開發環境。Android開發支 持Windows (Windows
當要進行耗時的操作的時候,往往會看見“請稍候”字樣的對話框。例如,用戶正在登入服務器,此時並 不允許用戶使用這個軟件,或者應用程序把結果返回給用戶