探索7.x, 全面解析Activity启动框架 (1)
無論怎么說,?Activity都是Android最核心的組件, 主要負責向用戶展示應用信息. Activity的生命周期由Android系統控制, 啟動與繪制都是自動完成. 對于開發人員而言, 僅僅是一句startActivity, 就完成了全部, 但是在平凡的表象下隱藏著驚人的秘密. 讓我們撥開迷霧, 一起探索Activity的啟動框架! Know more the world, know more ourselves.
Activity
本文源碼來源Android SDK 25(即7.1), 邏輯與低版本不同. 在AMS與ASS之間又添加ActivityStarter, 負責管理Activity的啟動.
Activity的啟動框架圖
Activity的啟動框架
Activity與Instrumentation
最簡單的Activity啟動方式, 如下:
Intent intent = new Intent(this, TestActivity.class); startActivity(intent);startActivity方法存在于Activity類中, Activity類的調用流程:
Activity#startActivityForResult核心是mInstrumentation.execStartActivity
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,@Nullable Bundle options) {if (mParent == null) {// ...Instrumentation.ActivityResult ar =mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options); // 核心方法// ...} else {// ...} }Instrumentation類負責監控系統與應用之間的交互.
execStartActivity核心是ActivityManagerNative類的getDefault#startActivity, 獲取IActivityManager單例, 本質是ServiceManager.getService("activity"), 即ActivityManagerService. 通過Binder, 遠程調用ActivityManagerService類的startActivity方法.
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {// ...try {// ...int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options); // 核心方法// ...} // ...return null; }Activity啟動通過遠程調用, 由當前應用交給ActivityManagerService(AMS)處理.
ActivityManagerService
ActivityManagerService類是負責啟動Activity的核心服務, 簡稱AMS. 啟動邏輯包含在ActivityStarter, ActivityStackSupervisor和ActivityStack和三個類中, ActivityStarter負責啟動, ActivityStackSupervisor負責管理Stack和TaskRecord, ActivityStack負責管理棧內的Activity.
Stack和TaskRecord示例:
Stack #1:Running activities (most recent first):TaskRecord{3caa65e3 #2711 A=me.chunyu.spike.wcl_activity_launchmode_demo U=0 sz=2}Run #1: ActivityRecord{36b06e99 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity t2711}Run #0: ActivityRecord{27396226 u0 me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity t2711}Stack #0:Running activities (most recent first):TaskRecord{27d796c9 #2695 A=com.miui.home U=0 sz=1}Run #0: ActivityRecord{2e5712cb u0 com.miui.home/.launcher.Launcher t2695}ActivityManagerService類的調用過程:
ActivityManagerService調用ActivityStarter的startActivityMayWait方法, 執行啟動.
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {// ...return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,profilerInfo, null, null, bOptions, false, userId, null, null); }ActivityStarter類負責處理Activity的Intent和Flags的邏輯, 還有管理Stack和TaskRecord.
ActivityStarter類的調用流程:
startActivityMayWait: 根據Intent獲取Activity的啟動信息(ResolveInfo和ActivityInfo), 獲取調用者的Pid和Uid.
startActivityLocked: 創建ActivityRecord, 含有Activity的核心信息.
startActivityUnchecked: 根據啟動的Flag信息, 設置TaskRecord, 完成后執行ActivityStackSupervisor類的resumeFocusedStackTopActivityLocked方法, 繼續啟動.
ActivityStackSupervisor類與ActivityStack類配合使用. ActivityStackSupervisor負責管理Task和Stack, 而ActivityStack負責管理在Stack和Task中的Activity. 因此, 對于Stack和Task的操作, AMS使用ActivityStackSupervisor進行管理; 對于Activity的操作, AMS使用ActivityStack進行管理. 兩者相互調用, 最終完成啟動Activity.
ActivityStackSupervisor類與ActivityStack類的調用流程:
核心在于ActivityStack類的resumeTopActivityInnerLocked方法, 根據ActivityRecord和ActivityOptions完成Activity的切換, 移至棧頂, 最后調用ActivityStackSupervisor類的startSpecificActivityLocked方法, 執行啟動.
ActivityStackSupervisor類的startSpecificActivityLocked方法調用realStartActivityLocked方法, 執行真正的啟動Activity.
void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {// 獲取啟動Activity的進程, 即ApplicationProcessRecord app = mService.getProcessRecordLocked(r.processName,r.info.applicationInfo.uid, true);r.task.stack.setLaunchTime(r);if (app != null && app.thread != null) {try {// ...// 真正啟動Activity的過程realStartActivityLocked(r, app, andResume, checkConfig);return;}// ...}// ... }在ActivityStackSupervisor的realStartActivityLocked方法中, 含有啟動的核心方法scheduleLaunchActivity, 即調用IApplicationThread的scheduleLaunchActivity方法.
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);IApplicationThread的實現是ApplicationThread, 而ApplicationThread是ActivityThread的內部類, 即使用ApplicationThread類的scheduleLaunchActivity方法處理Activity啟動.
最終由ActivityThread完成Activity的創建與繪制.
復雜的邏輯...
That's all! Enjoy it!
原文地址:?http://www.jianshu.com/p/269e3dc06b09
總結
以上是生活随笔為你收集整理的探索7.x, 全面解析Activity启动框架 (1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Android 插件化(二)] Dro
- 下一篇: 探索7.x, 全面解析Activity启