android基础-Activity启动流程

Activity-启动流程完整版

hi, 大家好,我是爱吃香蕉的猴子,最近一直在摸索Activity的启动流程,一直在参考的学习书籍是Android系统源代码情景分析_罗升阳我有电子版但是考虑版权问题,需要的朋友可以支持正版,若仅需要看部分内容的可以评论留言,我分享给你,闲话少说,搞起来 。。。


新规矩,先猜测后code再总结:在launcher上点击app

  • Launcher组件启动MainActivity组件的过程如下所示。
  • (1)Launcher组件向ActivityManagerService发送一个启动MainActivity组件的进程间通信请求。
  • (2)ActivityManagerService首先将要启动的MainActivity组件的信息保存下来,然后再向Launcher组件发送一个进入中止状态的进程间通信请求。
  • (3)Launcher组件进入到中止状态之后,就会向ActivityManagerService发送一个已进入中止状态的进程间通信请求,以便ActivityManagerService可以继续执行启动MainActivity组件的操作。(先将上一个Activity pause然后再启动新Activity)
  • (4)ActivityManagerService发现用来运行MainActivity组件的应用程序进程不存在,因此,它就会先启动一个新的应用程序进程。(先启动进程)
  • (5)新的应用程序进程启动完成之后,就会向ActivityManagerService发送一个启动完成的进程间通信请求,以便ActivityManagerService可以继续执行启动MainActivity组件的操作。
  • (6)ActivityManagerService将第2步保存下来的MainActivity组件的信息发送给第4步创建的应用程序进程,以便它可以将MainActivity组件启动起来。

- 宏观上图解一下 前五个步骤,大家应该都比较熟悉Activity ---> AMS

在这里插入图片描述

  • 在AMS中的处理,主要在ActivityStack中的处理
  • ActivityStack类有三个成员变量mResumedActivity、mLastPausedActivity和mPausingActivity,它们的 类型均为ActivityRecord,分别用来描述系统当前激活的Activity组件、上一次被中止的Activity组件, 以及正在被中止的Activity组件。
  • 由于系统当前正在激活的Activity组件是Launcher组件,即ActivityStack类的成员变量
    mResumedActivity指向了Launcher组件。
  • 成员函 数startPausingLocked来通知它进入Paused状态,以便它可以将焦点让给即将要启动的MainActivity组件。
  • Launcher组件处理完ActivityManagerService给它发送的中止通知之后,必须再向ActivityManagerService 发送一个启动MainActivity组件的通知,以便ActivityManagerService可以将位于Activity组件堆栈顶端 的MainActivity组件启动起来。
  • 7步都是在ActivityManagerService中执行的,接下来第13步到第17步是在应用程序Launcher 中执行的,主要用来处理ActivityManagerService发出的类型为SCHEDULE_PAUSE_ACTIVITY_ TRANSACTION的进程间通信请求。
    在这里插入图片描述
  • 第一件事情是调用成员函数performUserLeavingActivity向Launcher组件发送一个用户离开事件通 知,即调用它的成员函数onUserLeaveHint.
  • 第二件事情是调用成员函数performPauseActivity向Launcher组件发送一个中止事件通知,即调用 它的成员函数onPause。
  • 第三件事情是调用QueuedWork类的静态成员函数waitToFinish等待完成前面的一些数据写入操 作,例如,将数据写入到磁盘的操作。由于现在Launcher组件即将要进入Paused状态了,因此就要保 证它前面的所有数据写入操作都处理完成;否则,等到它重新进入Resumed状态时,就无法恢复之前 所保存的一些状态数据.
  • 执行完成这三件事情之后,ActivityThread类的成员函数handlePauseActivity就处理完 ActivityManagerService给它发送的中止Launcher组件的进程间通信请求了。在这里插入图片描述
  • 以上5步都是在应用程序Launcher中执行的,接下来第18步到第23步是在ActivityManagerService中 执行的,主要用来处理Launcher组件发出的类型为ACTIVITY_PAUSED_TRANSACTION的进程间通信 请求.
    在这里插入图片描述
  • 应用进程的启动
  • 第一件事情是在进程中创建一个ActivityThread对象,并且调用它的成员函数attach向ActivityManagerService 发送一个启动完成通知。
  • 第二件事情是调用Looper类的静态成员函数prepareMainLooper创建一个消息循环,并且在向 ActivityManagerService发送启动完成通知之后,使得当前进程进入到这个消息循环中。
    在这里插入图片描述
  • 主要是用来处理新的应用程序进程发出的类型为ATTACH_APPLICATION_TRANSACTION的 进程间通信请求。
    在这里插入图片描述
  • 主要用来处理ActivityManagerService发出的类型为SCHEDULE_LAUNCH_ACTIVITY_ TRANSACTION的进程间通信请求。
    在这里插入图片描述

TODO

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值