美文网首页
APP启动流程 基于android 11

APP启动流程 基于android 11

作者: 路人甲1234 | 来源:发表于2020-11-30 21:03 被阅读0次

相关类
Activity 管理UI
ActivityThread:进程入口,管理进程的相关事件处理。主线程入口。
包括许多内部类,其中H类是Handler类,控制了所有的应用程序事件:


image.png

LoadedApk : packageInfo

ApplicationThread:这是ActivityThread的内部类,它继承了binder.是ActivityThread与AMS通信的桥梁。


image.png

这里可以可以看到APP启动的大致流程,下面我们会对这个流程中的单个流程大致分析。

image.png

上图中主要是对启动流程图的第一步再细化
1-2从Launcher到Activity的方法调用都没什么好说的。最后传到Activity里面调用startAxtivityForResult()就是传入了一个intent。
3中startAxtivityForResult()里面主要做了两步,一步是4-5,通过binder调用AMS startActivity(),这里首先是调用Instrumentation.execStarActivitity(),

    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            if (ar != null) {
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            }

execStartActivity()里面调用ActivityTaskManager.getService()获取到IActivityTaskManager,IActivityTaskManager通过binder然后就请求到AMS

  public ActivityResult execStartActivity(
  ......
        try {
            intent.migrateExtraStreamToClipData(who);
            intent.prepareToLeaveProcess(who);
            int result = ActivityTaskManager.getService().startActivity(whoThread,
                    who.getBasePackageName(), who.getAttributionTag(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()), token,
                    target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

另一步6后面再说。到此就完成了launcher到AMS的请求。下面是AMS的server端处理

下图是AMS端的调用流程


image.png

executeRequest()这个方法很长,做了很多事,首先看到注释对此方法的描述


image.png

这个方法里面主要会对ActivityRecord和Task进行初始化或取用

关于ActivityRecord 和Task相关不再这里详述,参考下图和相关连接

ActivityRecord及相关数据结构,类的关系图:


image.png

ActivityRecord、TaskRecord、ActivityStack的相关知识点
https://www.jianshu.com/p/94816e52cd77
https://juejin.cn/post/6856298463119409165

最后

相关文章

网友评论

      本文标题:APP启动流程 基于android 11

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