AMS那些事兒

這里說的AMS進程,實際指的是System_server進程,System_server進程起來的時候啟動AMS服務(wù),AMS實際是ActivityManagerService的縮寫。

ActivityManagerService

管理Activity的生命周期

ActivityManagerNative

ActivityManagerService在服務(wù)器端的實現(xiàn),客戶端的請求調(diào)用ActivityManagerProxy后,通過IBinder,最終會在ActivityManagerNative中實現(xiàn)。ActivityManagerNative再通過調(diào)用ActivityManagerService的相關(guān)功能,以完成客戶端請求。

ActivityManagerProxy

ActivityManagerService的在客戶端的代理。負責(zé)和服務(wù)器端的ActivityManagerNative通訊。

點擊應(yīng)用目錄中應(yīng)用icon的啟動流程

(1)LauncherActivity通過Binder進程間通信的方式將應(yīng)用的信息通過Intent的方式傳遞給AMS,由AMS進行調(diào)度。
(2)如果系統(tǒng)中不存在該進程時,AMS將會請求Zygote服務(wù)去fork一個子進程,成功后返回一個pid給AMS,并由AndroidRuntime機制調(diào)起ActivityThread中的main()方法。
(3)緊接著,應(yīng)用程序的Main Looper被創(chuàng)建,ActivityThread被實例化成為對象并將Application的信息以進程間通信的方式再次回饋給AMS。此處指的是AMS會獲得一個binder對象,即ApplicationThread。AMS就是通過這個binder對象來調(diào)用應(yīng)用程序中的方法。同樣的應(yīng)用程序也通過AMS客戶端的代理類,ApplicationProxy來調(diào)用AMS的方法。
(4)AMS接收到客戶端發(fā)來的請求數(shù)據(jù)之后,首先將應(yīng)用程序綁定,并啟動應(yīng)用程序的Activity,開始執(zhí)行Activity的生命周期。

ActivityThread

1915184-b76be1a1e19381df.png

從圖中可以知道,mActivitiesmServicesmProviderMap 這三個變量都被保存在ArrayMap之中,他們分別保存了應(yīng)用中所有的Activity對象、Services對象、和ContentProvider對象。 咦?同為四大組件的BroadcastReceive去哪里了?注意,BroadcastReceiver對象沒有必要用任何數(shù)據(jù)結(jié)構(gòu)來保存,因為BroadcastReceiver對象的生命周期很短暫,屬于我調(diào)用它時,再創(chuàng)建運行,因此不需要保存BroadcastReceiver的對象。
我們都知道應(yīng)用中Applicaiton對象是唯一的,而mInitialApplication變量是恰恰是Application對象。當(dāng)你的應(yīng)用自定義一個派生Applicaiton類,則它就是mInitialApplication了。
ApplicationThread類型變量mAppThread是一個Binder實體對象,ActivityManagerService作為Client端調(diào)用ApplicationThread的接口,目的是用來調(diào)度管理Activity。
變量mResourcesManager管理著應(yīng)用中的資源。
ActivityThread相當(dāng)于一個CEO,管理調(diào)度著幾乎所有的Android應(yīng)用進程的資源和四大組件

ActivityThread的main函數(shù)

public static void More ...main(String[] args) {
5220 SamplingProfilerIntegration.start();
5221
5222 // CloseGuard defaults to true and can be quite spammy. We
5223 // disable it here, but selectively enable it later (via
5224 // StrictMode) on debug builds, but using DropBox, not logs.
5225 CloseGuard.setEnabled(false);

5226 // 初始化應(yīng)用中需要使用的系統(tǒng)路徑
5227 Environment.initForCurrentUser();
5228
5229 // Set the reporter for event logging in libcore
5230 EventLogger.setReporter(new EventLoggingReporter());
5231 //增加一個保存key的provider
5232 Security.addProvider(new AndroidKeyStoreProvider());
5233
5234 // Make sure TrustedCertificateStore looks in the right place for CA certificates //為應(yīng)用設(shè)置當(dāng)前用戶的CA證書保存的位置
5235 final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
5236 TrustedCertificateStore.setDefaultUserDirectory(configDir);
5237 //設(shè)置進程的名稱5238 Process.setArgV0("<pre-initialized>");
5239
5240 Looper.prepareMainLooper();
5241 //創(chuàng)建ActivityThread 對象
5242 ActivityThread thread = new ActivityThread();
5243 thread.attach(false);
5244
5245 if (sMainThreadHandler == null) {
5246 sMainThreadHandler = thread.getHandler();
5247 }
5248
5249 if (false) {
5250 Looper.myLooper().setMessageLogging(new
5251 LogPrinter(Log.DEBUG, "ActivityThread"));
5252 }
5253
5254 Looper.loop();
5255
5256 throw new RuntimeException("Main thread loop unexpectedly exited");
5257 }

下面的這段程序,首先Looper.prepareMainLooper();是為主線程創(chuàng)建了Looper,然后thread.getHandler();是保存了主線程的Handler,最后Looper.loop();進入消息循環(huán)。

Looper.prepareMainLooper(); //創(chuàng)建ActivityThread 對象 
ActivityThread thread = new ActivityThread(); 
thread.attach(false);
 if (sMainThreadHandler == null) 
{ 
        sMainThreadHandler =thread.getHandler(); 
}
 if (false) 
{
       Looper.myLooper().setMessageLogging(new      LogPrinter(Log.DEBUG,"ActivityThread")); 
} 
Looper.loop(); 
throw new RuntimeException("Main thread loop unexpectedly exited"); }

下面好好研究這段代碼

ActivityThread thread = new ActivityThread();
thread.attach(false);

進入attach方法

private void attach(boolean system)
 { 
    sCurrentActivityThread = this; 
    mSystemThread = system;
     if (!system) 
      { ...// 以上省略 
            RuntimeInit.setApplicationObject(mAppThread.asBinder()); 
            final IActivityManager mgr = ActivityManagerNative.getDefault(); 
            try 
           { 
                   mgr.attachApplication(mAppThread); 
            } 
           catch (RemoteException ex) 
           { 
                 throw ex.rethrowFromSystemServer(); 
           } ...// 以下省略 
   }
}

mAppThread的初始化

final ApplicationThread mAppThread = new ApplicationThread();

mAppThread是ActivityThread的成員變量。調(diào)用ActivityManagerService的attachApplication()方法,將mAppThread 作為參數(shù)傳入ActivityManagerService,這樣ActivityManagerService就可以調(diào)用ApplicaitonThread的接口了。ActivityManagerService作為Client端調(diào)用ApplicaitonThread的接口管理Activity。

在應(yīng)用中通過intent啟動Activity的過程

首先調(diào)用startActivity,最后都會轉(zhuǎn)到startActivityForResult。然后調(diào)用Instrumentation.execStartActivity,在execStartActivity里會調(diào)用ActivityManagerNative.getDefault().startActivity。ActivityManagerNative.getDefault()就是ActivityManagerProxy,這個是AMS在客戶端進程使用的代理類,在ActivityManagerNative.getDefault()中會通過ServiceManager.getService("activity")獲取ActivityManagerService 提供的 Binder 接口,并將這個binder傳入ActivityManagerProxy。這樣ActivityManagerProxy調(diào)用starActivity,里面就會調(diào)用了AMS的相應(yīng)函數(shù)。這樣就完成了從Activity到AMS的一次調(diào)用。那么如果AMS想要調(diào)用Activity的方法呢。這時候就用到剛才說的出入AMS的

參考資料:

Framework源碼分析(一):ActivityManagerService
http://www.itdecent.cn/p/194a37755fea
Framework源碼分析(三):ActivityThread
http://www.itdecent.cn/p/b6ac0c2fa240
ActivityThread的main方法究竟做了什么?
http://www.itdecent.cn/p/0efc71f349c8
Android Activity生命周期是如何實現(xiàn)的
http://www.itdecent.cn/p/27d06a6b7007
框架層理解Activity生命周期(APP啟動過程)
http://www.cnblogs.com/feng9exe/p/5706890.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容