ANR问题解析(一):AMS系统时间调节原理(1)

用于保存一个Activity的信息。

在ActivityRecord内部提供Token类实现IApplicationToken.Stub可以实现IPC回调其方法。一般是在WMS内部对其IPC调用。

img

2.3任务栈信息数据类TaskRecord

记录Activity所属任务栈信息。

img

二、Activity调度机制


Activity调度过程:

应用进程启动或者停止Activity—>报告给AMS,其内部维护所有应用进程启动或者停止Activity的记录—>AMS更新内部记录,并通知客户端进程操作—>客户端进程接收通知,执行操作

启动Activity的各种方式:

  • 应用程序中调用startActivity()

  • 在Home程序中单击应用程序图标启动Activity

  • 按“back”停止当前Activity启动新Activity

  • 长按“home”显示当前任务列表选择一个启动

1.ActivityThread类关系

img

AMS通过Binder跨进程通知ActivityThread启动、停止指定Activity。

ActivityThread作为Binder服务端实现指定接口由AMS远程调用。

ActivityThread可以看做是进程的Android运行环境。

2.Activity的launchMode

  • standard:默认启动模式,不管有没有已存在的实例都生成新的实例。

  • singleTop:如果栈顶存在对应的实例则重复利用不生产新的实例,不存在则新建实例。

  • singleTask:如果栈内存在对于的实例则使此Activity实例之上的其他Activity实例都出栈,使此Activity实例成为栈顶对象显示。

  • singleInstance:启用一个新栈放入新建Activity实例,并且该栈内只允许存在这一个Activity实例。

Intent中涉及到的Activity启动方式常量:

  • FLAG_ACTIVITY_NEW_TASK:将目标Activity放置到新的task中。

  • FLAG_ACTIVITY_CLEAR_TASK:启动一个Activity时先清除和其有关联的task,并新建Activity实例将其放入新的task中。必须和上面变量一起使用

  • FLAG_ACTIVITY_CLEAR_TOP:启动一个不处于栈顶的Activity时,清除排在它前面的Activity使其显示出来。

3.AMS启动Activity流程

以下实例为使用am命令启动一个Activity的流程:

img

整个调用步骤过程如下:

1.首先IPC调用AMS方法传入参数启动指定Activity

2.在AMS中首先查询PKMS获取该ActivityInfo,新建ActivityRecord和根据lunchMod创建TaskRecord两个重要变量,并且将ActivityRecord添加到task栈顶作为准备启动的Activity。

3.在正式启动Activity之前首先检查其进程是否启动,为启动时通知AMS启动对应进程。

下图就是AMS创建Activity对应进程及启动Activity的过程:

img

整个调用步骤过程如下:

1.首先就是zygote进程fork新进程,指定新进程执行需要启动的ActivityThread类。

2.在ActivityThread的main()方法中:

  • 首先新建ActivityThread对象。

  • 接着回调AMS接口通知其应用进程已启动成功。

  • 最后开启主线程消息循环,处理消息。

3.其中上步骤第二点在与AMS交互中IPC调用AMS的attachApplication()函数中:

  • 首先根据pid查找对应的ProcessRecord

  • 设置该应用退出时的回调接口

  • 修改ProcessRecord一些参数

  • 最后与应用进程交互,开始创建Application对象

4.AMS与应用进程交互时会发出一个异步消息,该消息内部:

  • 配置运行时信息

  • 安装该Application对应的ContentProvider

  • 生成一个Application对象并且回调onCreate()函数

5.AMS与应用进程交互完接着准备启动目标Activity,在ActivityStackSupervisor.attachApplicationLocked()函数中会首先获取需要启动的ActivityRecord并保存到对应的ProcessRecord,接着IPC调用应用进程启动Activity。

6.在应用进程中也是异步消息处理

  • 首先反射实例化目标Activity对象,回调相应onStart()之前的生命周期函数

  • 接着回调onResume()函数并且添加一个Idler消息对象到队列中。该对象内部方法会调用到AMS中的相应方法处理因此次启动而被暂停的Activity的相关声明周期函数处理。

7.同时在AMS中会将task添加到最近任务列表中,并且发送10s定时等待这个Activity处理结果。

8.此时目标Activity已经被成功启动,接着会处理一些Pending组件,这些组件可能是在系统启动未成功时发起的一些启动指令。

最后

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

image

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。**

[外链图片转存中…(img-tzTVoZdX-1714930186867)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值