前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android面试题之Activity启动流程

Android面试题之Activity启动流程

作者头像
AntDream
发布2024-06-13 21:09:52
400
发布2024-06-13 21:09:52
举报

Launcher -> AMS

activity -> instrumentation -> AMS

AMS处理
Launcher应用启动新的应用

1、 启动activity,通过Binder机制,调用AMS启动新的Activity

2、 AMS会先回调Launcher(通过ActivityStack等跟activity栈有关的类)的ApplicationThread(Binder),然后走ActivityThread的pauseActivity相关的流程,最终调用到 Activity.performPause流程走pause生命周期

3、 走完pause后又回调到AMS的activityPaused方法,接着走ActivityStack的activityPausedLocked,然后是ActivityStackSupervisor,发现应用的进程还没有起来

4、 然后AMS发起创建应用进程的请求startProcess,走到zygote进程fork出新的应用进程,期间一通操作,最后会反射调用ActivityThread的main方法,在里面new一个ActivityThread,初始化Handler和Looper等

5、 在ActivityThread 的main方法里会调用attach方法,在里面会利用Binder通信,调用AMS的attachApplication

6、AMS后面又会调回到ActivityThread的handleBindApplication方法,这里主要是创建LoadedApk和ContextImpl,然后反射创建Instrumentation,接着调用LoadedApk的makeApplication方法,先初始化ClassLoader,然后创建ContextImpl,里面实际上是用 Instrumentation.newApplication方法通过类加载的方式加载的Application,加载完就立刻调用了Application的attach方法

7、 这里创建的ContextImpl没有赋值类加载器,包含的是线程信息和包的信息以及资源

8、这个加载application的类加载器就是前面创建的PathClassLoader,但实际上应该是通过双亲委托,用BootClassLoader加载的

9、 application的attach方法会调用attachBaseContext方法,给ContextWrapper的mBase赋值。也就是Application的attachBaseContext方法是最先调用的,比下面的Provider和Application的onCreate方法还早

10、 接着通过installContentProviders加载ContentProviders(这里可以看到ContentProvider是比Application的OnCreate方法更靠前的)

11、 接着通过 Instrumentation.callApplicationOnCreate方法,调用到Application的OnCreate方法

12、以上都走完,又会回到ActivityStackSupervisor,执行realStartActivityLocked进行Activity的加载

App里启动新的activity

同上面的不同,这种情况不会创建应用进程,也不会有Application的创建,这里是直接走activity的加载

创建初始化ClassLoader

1、 在上面的LoadedApk的makeApplication方法中,会先初始化ClassLoader

2、 这里通过LoadedApk的getClassLoader方法获取,如果ClassLoader为null,就调用createOrUpdateClassLoaderLocked方法

3、 这里刚刚创建LoadedApk,会调用ClassLoader.getSystemClassLoader()创建,并保存在mDefaultClassLoader

4、 上述方法最终会调用到ClassLoader.createSystemClassLoader()方法,这里会new一个PathClassLoader,并且Parent为BootClassLoader

5、 创建完成后,又赋值给LoadedApk的mClassLoader变量

LoadAPK
  • 里面有Resources这个成员,可以通过getResources方法获取
  • Resources里的AssetManager管理着APK中所有的资源,资源是通过native流加载
activity的启动加载过程

1、 AMS的ActivityStarter会创建ActivityRecord,然后会找出所有的适合Intent的Activity,如果有多个就会弹出dialog让用户选(最终是从PMS里找)

2、 根据启动标志位和Activity启动模式来决定如何启动一个Activity以及是否要调用deliverNewIntent方法通知Activity有一个Intent试图重新启动它,然后ActivityStackSupervisor一通调用,最后会回调到ActivityThread的handleLaunchActivity,主要逻辑是在performLaunchActivity方法

3、 通过Instrumentation用类加载加载Activity,然后调用activity的attach方法把activity、window、context进行绑定

4、 activity的attach方法里面,会创建PhoneWindow(会同时通过LayoutInflater的from方法创建LayoutInflater),以及其他一系列activity属性成员的初始化

5、 最后调用Instrumentation的callActivityOnCreate方法,调用activity的onCreate

6、 在activity的onCreate中,我们一般会setContentView,会调用到PhoneWindow的setContentView进行布局的加载,当然PhoneWindow会先进行decorView的加载,接着会就会调用LayoutInflater进行加载,最终通过createViewFromTag方法进行View的创建

7、 创建View时,是用的LayoutInflater中的一个Factory2的onCreateView接口

补充

activity启动流程AMS部分

1、 resolveActivity,找出最合适的activity,以及是否有result回调的处理 2、 一系列的权限校验 3、创建ActivityRecord对象 4、 调用startActivityUnchecked方法,这里面会进行启动模式的处理判断,

  • 主要是把处理结果在mLaunchFlags上追加对应的标记
  • 获取activity的启动栈,然后把mLaunchFlags设置给intent
  • 如果是clear_top模式,会清理栈上面的activity,然后会判断要不要去deliverNewIntent,去触发onNewIntent
  • 然后判断是否需要新创建一个task
  • 然后会走resumeTopActivityUnCheckedLocked方法

5、 resumeTopActivityInnerLocked方法里面会把之前的activity pause 6、 最后会调用到ActivityStackSupervisor的startSpecificActivityLocked方法,这里会判断当前应用进程是否已经启动,没有的话会先走启动App进程的流程,已经启动的话就走启动activity的流程(realStartActivityLocked)

以上是个人的一点思考,希望对大家有帮助。也欢迎大家留言区一起讨论。

END

点亮【赞和在看】,让钱和爱都流向你。

心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油💪,一起遇见更好的自己

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AMS处理
    • Launcher应用启动新的应用
      • App里启动新的activity
        • 创建初始化ClassLoader
          • LoadAPK
            • activity的启动加载过程
            • 补充
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档