Activity启动流程

参考文章:

开始前的啰嗦

Activity的启动流程看了很久,今天终于看懂了。其实,要清晰整个流程,重点在于:

  1. 要把Activity的启动流程跟系统架构图联系起来,这样明白Activity启动流程中跨进程通信的含义,也才能明白谷歌设计的原因。
  2. 清晰各个类的作用,他们在架构图中所处的层级,以及在通信中分别处于哪一端(服务端还是客户端)。因为在Activity启动流程中涉及两次Binder通信,这也是第一次看代码时容易懵逼的原因。(反正我是懵逼了~~~)
  3. 最后,多画图,多总结。

正式开始。

步骤一:认识Android架构

先阅读Android系统开篇,要对整个Android体系有个了解,才能继续。下面这张图是来自上面的文章,只不过我加了点注释。

在看图时,牢牢记住下面几个标蓝的地方,因为Activity的启动跟他们息息相关。

步骤二:熟悉Binder通信

详细请阅读:Binder + AMS + ADIL大杂烩里面推荐的文章 看完之后,看下面一张图,巩固一下自己的了解:

步骤三:初略过一遍代码,大概缕清流程

这一阶段请参考文章 Android系统篇之----解读AMS远端服务调用机制以及Activity的启动流程,里面注释的很清楚。

步骤四:画张图,自己整理一下思路

注:

  • AMS: ActivityManagerService
  • ASS: ActivityStackSupervisor
  • AMN : ActivityManagerNative
  • AMP : ActivityManagerProxy

到这里,Activity启动的学习之旅大致就结束了。。。终于把自己多年前埋下的坑填了。 文章中很多都是分享大神博客的链接。作为渣渣一枚,我也没有造轮子的打算,只是单纯分享一下自己在学习中看到的好的博客,让大家找资料的时候方便一点。

补充知识

Activity的启动模式

四种:

  • standard : 每次都新建一个实例
  • singleTop:栈顶如果有该Activity的实例,重用

如果栈顶有一个相同类型的Activity实例的话,将不会创建新的,而是会通过调用**onNewIntent()**方法将intent发送到这个已经存在的Activity实例中。so,使用 singleTop 模式时,你必须同时在 onCreate() 和 onNewIntent() 方法中接受处理发送而来的 Intent 数据,以应对所有使用场景。

使用常见:搜索界面。通常我们会在搜索结果页面也放置一个搜索框,使用户在不需要按返回键的情况下搜索其他关键字。此时,为了不每次都新建一个搜索结果页面,我们会将搜索结果页面设置为singleTop,每次更新搜索关键字时,我们发送一个 Intent 到已经存在的 Activity 实例并让它更新搜索结果。 此时的生命周期:

  • Activity.onPause
  • Activity.onNewIntent
  • Activity.onRestart
  • Activity.onStart
  • Activity.onResume
  • singleTask:栈内如果有该Activity的实例,重用(有点像单例)

如果系统中已经有一个 Activity 实例的话,拥有该实例的 Task 将被移到顶部,并且 Intent 将通过 onNewIntent() 方法传递过来。 but,**但是根据实际经验,它并不是像描述这样工作的。**根据 dumpsys activity 命令展示的结果,singleTask Activity 被放入调用者 Task 的栈顶。 如果你希望让 singleTask Activity 表现得像官方描述那样:创建一个新的 Task 并作为根 Activity 放置,你需要像下面这样额外指派 taskAffinity 属性给这个 Activity。

<activity
    android:name=".SingleTaskActivity"
    android:label="singleTask launchMode"
    android:launchMode="singleTask"
    android:taskAffinity="">
复制代码
  • singleInstance:应用间,进程间或线程间有该Activity的实例,重用(系统中只存在一个 Activity 实例)

Looper.loop()为什么不会导致卡顿?

参考:Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值