理解ActivityManagerService
--摘自《Android进阶解密》
*AMS家族*
1.Android 7.0的AMS家族
2.AMP和AMS进行通信
3.(Android 7.0)AMP是AMN的内部类,它们都实现了IActivityManager接口,这样它们就可以实现代理模式,具体来讲是远程代理:AMP和AMN是运行在两个进程中的,AMP是Client端AMN则是Server端,而Server端中具体的功能都是由AMN的子类AMS来实现的,因此,AMP就是AMS在Client端的代理类。AMN又实现了BInder类,这样AMP和AMS就可以通过Binder来进行进程间通信。ActivityManager通过AMN的getDefault方法得到AMP,通过AMP就可以和AMS进行通信
4.Android 8.0AMS家族
要实现进程间通信,服务端也就是AMS只需要继承IActivityManager.Stub类并实现相应的方法就可以了。采用AIDL后就不需要使用AMS的代理类AMP了,因此Android 8.0去掉了AMP,代替它的是IActivityManager,它是AMS在本地的代理。
*AMS的启动过程*
1.AMS的启动是在SystemServer进程中启动的
2.SystemService的子类分为3中类型
1)引导服务:ActivityManagerService、PowerManagerService、PackageManagerService
2)核心服务:DropBoxManagerService、BatteryService、UsageStateService、WebViewUpdateService
3)其他服务:CameraService、AlarmManagerService、VrManagerService
3.AMS与应用程序进程的关系
1)启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在
2)如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程
*AMS重要的数据结构*
------------
1.ActivityStack是一个管理类,用来管理系统所有的Activity,其内部维护了Activity的所有状态、特殊状态的Activity以及Activity相关的列表等数据。ActivityStack是由ActivityStackSupervisor来进行管理的
2.ActivityStack维护了元素类型为TaskRecord的列表,这样ActivityStack和TaskRecord就有了关联,Activity任务栈存储在ActivityStack中
*Activity任务栈模型*
1.TaskRecord用来表示Activity的任务栈
2.singleTop和singleTask时,该Activity的onNewIntent方法会被调用
3.如果Launch Mode和FLAG设定的Activity启动方式有冲突,则以FLAG设定的为准
*taskAffinity*
1.在AndroidManifest.xml中设置android:taskAffinity,用来指定Activity希望归属的栈。
2.如果allowTaskReparenting为true,说明Activity具有转移的能力
最新文章
- Dropzone.js实现文件拖拽上传
- 【干货分享】流程DEMO-借款申请
- October 25th Week 44th Tuesday 2016
- Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布
- android加固系列—6.仿爱加密等第三方加固平台之动态加载dex防止apk被反编译
- 最近开始做Android了
- iOS 常用英语翻译
- [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- 禁用iOS9 App Transport Security(ATS)特性时不起作用
- jquery判断对象是否获得焦点
- 让JAVA代码跑得更快
- 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽
- JavaScript单例模式
- 使用KnockoutJs+Bootstrap实现分页
- 什么是HTML?HTML5是什么?HTML5有那些优势和特性?
- 区块链代币(Token)笔记 — — 术语
- ABP项目概述
- 搭建 consul 集群
- vue环境下安装npm,启动npm 修改js,css样式
- .NET并行计算和并发3.2-多线程调用Invoke
热门文章
- magento2 - Invalid credentials for 'https://repo.magento.com/packages.json', aborting.
- CentOS7配置iptables防火墙
- saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)
- linux中使用gdb调试程序
- Ubuntu操作用户账户
- [物理学与PDEs]第3章习题6 Lagrange 坐标下的一维理想磁流体力学方程组的数学结构
- Pandas时间处理的一些小方法
- vscode 正则表达式替换
- 版本控制工具 - TortoiseSVN
- MySql存储过程及函数