Activity启动流程总结

作者: 奔跑吧李博 | 来源:发表于2021-04-25 12:09 被阅读0次
  • 主要流程解析:
1. Launcher请求AMS过程

Launcher -> Activty -> Instrumetation -> IActivityManager -> AMS

调用startActivity,会调用startActivityForResult:

    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }

startActivityForResult中调用mInstrumentation.execStartActivity方法

    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
      ...
Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
      ...
}

execStartActivity中调用ActivityTaskManager.getService():

int result = ActivityTaskManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
    /** @hide */
    public static IActivityTaskManager getService() {
        return IActivityTaskManagerSingleton.get();
    }

IActivityManager是通过AIDL跨进程通信获取到binder对象,它的实现类是ActivityManagerService。

    private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
            new Singleton<IActivityTaskManager>() {
                @Override
                protected IActivityTaskManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                    return IActivityTaskManager.Stub.asInterface(b);
                }
            };

ActivityTaskManagerService中调用startActivity,跟AMS进行跨进程通信。

    @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. AMS到ApplicationThread的调用过程

AMS -> ActivityStarter -> ActivityStackSupervisor -> ActivityStack -> ApplicationThread

然后获取ActivityStarter,

        @Override
        public ActivityStarter obtain() {
            ActivityStarter starter = mStarterPool.acquire();

            if (starter == null) {
                starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
            }

            return starter;
        }

ActivityStarter是Android7.0中新加入的类,它是加载Activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为Activity,并将Activity和Task以及Stack相关联。

然后调用ActivityStack,
ActivityStack是Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。

获取ApplicationThread,通过ApplicationThread来与应用程序进程进程Binder通信(跨进程通信),也就是说ApplicationThread是AMS和应用程序进程的通信桥梁。

3. ApplicationThread启动Activity的过程

ApplicationThread ->ActivityThread -> H类 (hander) -> Instrumentation->Activity

ActivityThread类内部:

public final class ActivityThread extends ClientTransactionHandler {
          final ApplicationThread mAppThread = new ApplicationThread();
          final H mH = new H();
}

ApplicationThread是ActivityThread的内部类,ActivityThread负责管理当前应用程序进程的主线程。H,它是ActivityThread的内部类并继承自Handler,是应用程序进程中主线程的消息管理类。

scheduleLaunchActivity通过sendMessage向H类发送类型为LAUNCH_ACTIVITY的消息,H类的handleMessage方法,处理消息,调用ActivityThread的handleLaunchActivity,接着调用performLaunchActivity,又回到应用程序与系统交互的监控类Instrumentation,Instrumentation调用activity的oncreate方法,开启activity的生命周期。

Instrumentation: 每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的具体管理与实现,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。

参考:https://www.cnblogs.com/anni-qianqian/p/10175729.html
3分钟看懂Activity启动流程
https://blog.csdn.net/my_csdnboke/article/details/106173074

相关文章

网友评论

    本文标题:Activity启动流程总结

    本文链接:https://www.haomeiwen.com/subject/zvmrrltx.html