一 startActivity()启动指定的Activity
本文基于android 9.0代码,现在主要分析点击一个图标启动一个新的activity。具体的流程图如下:
AMS_start_process.png
通过上面的流程启动一个新的进程,并运行activitythread中的main函数,接下来在进程中创建并启动activity,具体流程如下:
AMS_thread_main.png
在realStartActivityLocked中,通过状态机依次调用oncreate onstart onresume,完成activity的启动
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, mService.isNextTransitionForward(),
profilerInfo));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
二 AMS中的结构体
Android中,app process 和task是三种不同的概念。
Process linux中的进程。
APP 一般一个app独占一个process,有一些Process是app的容器,有多个app共享一个process或者uid的情况
task是一个activity栈,其中可能来自多个app的activity,来自多个process,杀task一般是关闭task的根activity引出的子树,不一定会kill掉对应的process
AMS_Activity stack.png
三 context分析
Context类具体的作用
1、Context描述的是一个应用程序相关的信息,即上下文;
2、Context类是一个抽象类,Android提供了其具体实现类(即ContextIml类);
3、通过Context可以获取应用程序的resources和classes,也包括一些应用级别的操作,如:启动一个activity、发送广播、接收intents等。
AMS_context.png
application中contextimpl创建
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
activity中contextimpl创建
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ContextImpl appContext = createBaseContextForActivity(r);
appContext.setOuterContext(activity);
service中contextimpl创建
private void handleCreateService(CreateServiceData data) {
ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
context.setOuterContext(service);