Android AMS分析之Activity启动过程

年代久远,仅供参考

  在Android framework的systemService中有多个以线程形式存在的Service, 如ActivityManagerService、WindowMangerService等等, 其中ActivityManagerService(AMS)是个很重要的Service, 管理着四大组件的生命周期,本文先从Activity的启动过程入手, 了解从App端请求一个Activity, 到AMS进行一系列处理并与之交互的大概流程, 从而对Acitivity的启动过程有一个感性的认识。

首先,应用端通过Activity.startActivity()的方式启动一个Activity, 通过binder方式调用AMS所在进程方法。AMS收到请求后, 构建一个此Activity对应的ActivityRecord对象,并加入到内部缓存队列mHistory中。随后调用resumeTopActivityLocked()方法,开始启动Activty。

过程如下图所示:

开始启动新Activity时,resumeTopActivityLocked()方法从刚刚的那个mHistory里取存在栈顶的Activity,就是刚刚put进的那个新Activity,但这是AMS会先判断mResumedActivity是否为空,即当前是否有一个正在显示的Activity,如果有,则先去暂停这个旧的Activity。这个过程中会回调App进程的相应方法,我们常见的onPause()就是在这个过程里调用的。暂停后,这个Activity对应的ActivityRecord对象会被放到mStoppingActivities缓存里去,此时旧Activity还没有完全停掉。

如下图

在暂停之后,AMS会再次调研resumedTopActivityLocked()方法

resumedTopActivityLocked()还是先取mHistory栈顶的Activity(ActivityRecord对象),此时已没有正在显示的Acitvity,所以往下走去启动新的Activity。

在启动这个Activity之前,会判断Activity所在的进程是否启动,如果没启动,则先启动进程,进程启动后,会回调AMS的attachApplicationLocked()方法。在一系列处理之后,调用realStartActivityLocked()方法,这个时候,就要真正开始启动这个Activity了

在realStartActivityLocked()方法中,通过调用scheduleLaunchActivity()方法回调到App进程,App进程随后会调用到performLaunchActivity()方法,在这个方法里完成我们熟悉一些Activity生命周期相关方法的调用。比如,如果发现application对象不存在,会先生成application对象,随后调用其onCreate方法,这就是我们熟悉的Application.onCreate()方法。随后会继续调用Activity的onCreate、onStart、onResume等方法,随后调用activityIdleInternal()通知AMS。这个时候新Activity已经显示在页面上了。此时AMS才会回过头停止掉旧的Activity(就是从之前的那个mStoppingActivities缓存里获取)。随后调用trimApplications();进行一次内存清理操作。

此时一个Activity的启动过程基本完成。AMS只是管理Activity的生命周期,具体的绘制相关工作由WMS来管理完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值