本來(lái)是想寫下activity生命周期的調(diào)度過(guò)程蟋滴,但是想想直接寫的話有點(diǎn)突兀烘浦,感覺(jué)還是先分析下activity的啟動(dòng)然后在分析生命周期比較順暢最冰。BTW,第一次用markdown語(yǔ)法寫希望好用。
這里的分析是基于7.0的源碼并且只分析一般的啟動(dòng)過(guò)程,沒(méi)有forResult,也考慮特殊的launchMode.還有就是描述寫的不多匹涮,只是記錄調(diào)用的過(guò)程。
1.As we all know, activity啟動(dòng)其它activity是通過(guò)Instrumentation完成的槐壳,所以這里直接從Instrumentation開(kāi)始.
/>android.app.Instrumentation.execStartActivity()
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
這里的ActivityManagerNative.getDefault得到的是一個(gè)ActivityManagerProxy單例對(duì)象然低,其中封裝了對(duì)ActivityManagerService的IBinder對(duì)象的調(diào)用∥裉疲總之最后調(diào)用的是ActivityManagerService的startActivity雳攘。
/>com.android.server.am.ActivityManagerService
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, bOptions,
UserHandle.getCallingUserId());
}
2.ActivityManagerService執(zhí)行過(guò)程. 代碼太多,只記錄下方法的調(diào)用流程枫笛。并且這里假設(shè)要啟動(dòng)的activity所在進(jìn)程還沒(méi)啟動(dòng)吨灭。
--數(shù)字 代表當(dāng)前方法調(diào)用下個(gè)方法的代碼行號(hào)
-
> ActivityManagerService.startActivityAsUser() --4399
-
ActivityStarter.startActivityMayWait() --860
-
ActivityStarter.startActivityLocked() --516
-
ActivityStarter.startActivityUnchecked() --1243
-
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
-
ActivityStack.resumeTopActivityUncheckedLocked() --2127
-
ActivityStack.resumeTopActivityInnerLocked() --2269
-
ActivityStackSupervisor.pauseBackStacks() --961 這一步是遍歷所有后臺(tái)ActivityStack,查看是否有resumed狀態(tài)的Activity存在刑巧,存在則招待pause操作
-
ActivityStack.startPausingLocked() --1141
ApplicationThread.schedulePauseActivity() 這一步是調(diào)用要執(zhí)行pause操作的activity所在進(jìn)程的ApplicationThread.schedulePauseActivity方法, 在應(yīng)用的進(jìn)程中停止activity,然后AMS的工作就暫時(shí)完成了喧兄。
-
-
-
-
-
-
-
-
應(yīng)用進(jìn)程執(zhí)行activity的pause操作完成后,會(huì)通過(guò)應(yīng)用進(jìn)程的ActivityThread回調(diào)AMS的activityPaused方法
-
ActivityThread.handlePauseActivity() --3697
-
ActivityManagerService.activityPaused() --7006
-
ActivityStack.activityPaused() --1212
-
ActivityStack.completePauseLocked() --1332
-
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked() --1830
-
ActivityStack.resumeTopActivityUncheckedLocked() --2127
-
ActivityStack.resumeTopActivityInnerLocked() --2577
-
ActivityStackSupervisor.startSpecificActivityLocked() --1420 這里會(huì)判斷當(dāng)前要啟動(dòng)的Activity的進(jìn)程是否啟動(dòng)
-
ActivityManagerService.startProcessLocked() --3547
-
ActivityManagerService.startProcessLocked() --3666
*ActivityManagerService.startProcessLocked() --3832
*Process.start() 這里通過(guò)Zygote進(jìn)程創(chuàng)建一個(gè)新進(jìn)程啊楚。AMS的工作暫時(shí)完成吠冤,需要等新進(jìn)程回調(diào)AMS才繼續(xù)啟動(dòng)Activity的操作。
-
-
-
-
-
-
-
-
-
新進(jìn)程創(chuàng)建成功后會(huì)執(zhí)行ActivityThread的main方法恭理,并通過(guò)attach方法調(diào)用AMS的attachApplication方法和AMS進(jìn)行綁定操作拯辙。AMS又通過(guò)調(diào)用ApplicationThread的bindApplication方法通知綁定成功,然后應(yīng)用進(jìn)程會(huì)創(chuàng)建應(yīng)用的Application和Instrumentation等對(duì)象颜价,回調(diào)結(jié)束后AMS接著做下面的操作
-
ActivityManagerService.attachApplicationLocked() --6693
-
ActivityStackSupervisor.attachApplicationLocked() --866 這里會(huì)遍歷查找需要顯示的Activity,也就是之前想要啟動(dòng)的Activity
-
ActivityStackSupervisor.realStartActivityLocked() --1310
ApplicationThread.scheduleLaunchActivity() --over
-
-
***到這Activity啟動(dòng)就算結(jié)束了涯保,后面就是通過(guò)IPC調(diào)用應(yīng)用進(jìn)程的ApplicationThread執(zhí)行真正的創(chuàng)建activity并展示的操作了诉濒。 ***