Android-Activity启动流程简析
本文最后更新于 652 天前
1. 普通Activity创建


– activity向Instrumentation请求创建

  • Instrumentation通过AMS在本地进程的IBinder接口,访问AMS,这里采用的跨进程技术是AIDL。

  • 然后AMS进程一系列的工作,如判断该activity是否存在,启动模式是什么,有没有进行注册等等。

  • 通过ClientLifeCycleManager,利用本地进程在系统服务进程的IBinder接口直接访问本地ActivityThread。

  • ApplicationThread是ActivityThread的内部类,IApplicationThread是在远程服务端的Binder接口

  • ApplicationThread接收到服务端的事务后,把事务直接转交给ActivityThread处理。

  • ActivityThread通过Instrumentation利用类加载器进行创建实例,同时利用Instrumentation回调activity的生命中周期Instrumentation是activity与外界联系的类(不是activity本身的统称外界,相对activity而言),activity通过Instrumentation来请求创建,ActivityThread通过Instrumentation来创建activity和调用activity的生命周期。

  • ActivityThread,每个应用程序唯一一个实例,负责对Activity创建的管理,而ApplicationThread只是应用程序和服务端进

2. 根Activity创建

  • Launcher进程请求AMS创建activity
  • AMS请求Zygote创建进程。
  • Zygote通过fork自己来创建进程。并通知AMS创建完成。
  • AMS通知应用进程创建根Activity。
3. 具体流程
3.1 Activity请求AMS的过程
  • 若是根Activity需要经过额外的创建 – 调用Launcher的startActivitySafely方法来启动应用程序
  • Activity通过Instrumentation来启动Activity – startActivityForResult方法内mInstrumentation.execStartActivity
  • Instrumentation请求AMS进行启动。该类的作用是监控应用程序和系统的交互。到此为止,任务就交给了AMS了,AMS进行一系列处理后,会通过本地的接口IActivityManager来进行回调启动activity
    execStartActivity方法内 ActivityManager.getService().startActivity 获取AMS启动Activity
3.2 AMS处理请求的过程 (内容较长查看原文章)
  • ActivityStartController => ActivityStarter(预处理、创建进程等) => ActivityStackSupervisor(Activity栈相关,结合ActivityStack) => startSpecificActivityLocked => realStartActivityLocked(进行真正的启动,ClientTransaction、添加执行Resume事务ResumeActivityItem) mService.getLifecycleManager().scheduleTransaction(clientTransaction);
  • ClientLifecycleManager – (mService.getLifecycleManager()) 事务管理类,负责执行事务
  • ActivityLifecycleItem -> ClientTransaction -> ClientLifecycleManager (右调用左)
  • scheduleTransaction方法内,transaction.schedule() > 通过本地ApplicationThread在服务端的接口IApplicationThread来进行跨进程通信
/frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java/;

//这里的IApplicationThread是要启动进程的IBinder接口
//ApplicationThread是ActivityThread的内部类,IApplicationThread是IBinder代理接口
//这里将逻辑转到本地来执行
private IApplicationThread mClient;
public void schedule() throws RemoteException {
    mClient.scheduleTransaction(this);
}

3.3 ActivityThread创建Activity的过程
  • scheduleTransaction – IApplicationThread接口的本地实现类ActivityThread的内部类ApplicationThread
    使用Handler的sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);处理
  • Handler对事务进行处理。调用事务池来处理事务 – mTransactionExecutor.execute(transaction);
  • execute方法执行事务是 上述realStartActivityLocked 添加的两个事务
  • 事务LaunchActivityItem 调用ActivityThread执行创建逻辑
  • ActivityThread 主要利用Instrumentation来创建activity和回调activity的生命周期,并创建activity的上下文和app上下文(如果还没创建的话)涉及 handleLaunchActivity,performLaunchActivity(最后会回调onCreate方法)
  • Instrumentation通过类加载器来创建activity实例
  • 通过AppComponentFactory工厂来创建实例。
4. 启动模式
4.1 在没有主动添加 Intent flag 的情况下
  • standard 和 singleTop 这两种模式下 taskAffinity 属性均不会生效,这两种模式启动的 Activity 总会尝试加入到启动者所在的任务栈中,如果启动者是 singleInstance 的话则会创建一个新的任务栈
  • standard 模式的 Activity 每次启动都会创建一个新的实例,不会考虑任何复用
  • singleTop 模式的 Activity 想要被复用,需要启动者所在的任务栈的栈顶就是该 Activity 实例
  • singleTask 模式的 Activity 事实上是系统全局单例,只要实例没有被回收就会一直被复用。singleTask 可以通过声明 – taskAffinity 从而在一个特定的任务栈中被启动,且允许其它 Activity 一起共享同一个任务栈。如果不声明 – taskAffinity 的话就会尝试寻找或者主动创建 taskAffinity 为 applicationId 的任务栈,然后在该任务栈中创建或复用 Activity
  • singleInstance 可以看做是 singleTask 的加强版,singleInstance 在任何时候都会独占一个任务栈,不管是否声明了 taskAffinity。在 singleInstance 任务栈中启动的其它 Activity 都会加入到其它任务栈中
4.2 Intent flag 的优先级会比 launchMode 高
  • 非Activity上下文StartActivity 需要显式设置FLAG_ACTIVITY_NEW_TASK,具体校验在ContextImpl
  • Activity上下文环境下,不需要显式设置。 Activity重写了StartActivity,方法内调用Instrumentation.execStartActivity,其会通过binder调用AMS中的方法,AMS经过处理会对singleTask及singleInstance设置FLAG_ACTIVITY_NEW_TASK
    FLAG_ACTIVITY_NEW_TASK
    > standard + FLAG_ACTIVITY_NEW_TASK,可以变更taskAffinity属性作用,默认standard下taskAffinity 属性不会生效,设置FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_SINGLE_TOP

可以覆盖standard的表现,即便是standard模式,如果在栈顶,则直接复用。

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_CLEAR_TOP 单独使用会销毁指定Activity及以上活动,并重建新的Activity
配合FLAG_ACTIVITY_SINGLE_TOP 则会相应的复用,并销毁指定Activity及以上活动

FLAG_ACTIVITY_CLEAR_TASK

需要配合FLAG_ACTIVITY_NEW_TASK使用,flag 的优先级很高,即使是 singleInstance 类型的 Activity 也会被销毁

原文章链接

iichen:https://iichen.cn/?p=425
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇