AMS startactivity分析

一 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);

你可能感兴趣的:(AMS startactivity分析)