Android app 与 ActivityManagerService的通信原理(简化版)
来源:互联网 发布:centos 迅雷 编辑:程序博客网 时间:2024/05/21 01:46
1. Android app 与 ActivityManagerService的通信原理(简化版)
Android 的app与 ActivityManagerService (以下简称AMS)的通信是这样的:
对上图的简单说明:
(1) Android app表示Android应用的进程;
(2) Activity Manager Service表示AMS所在的进程(应为system_server,这里为了图的直观,不引出更多的名词);
(3) Andoid app相关的内容用蓝色表示,AMS相关的内容用紫色表示。
(4) Android app 通过调用IActivityManager
将消息传递给AMS; IActivityManager
的获取:通过ActivityManagerNative.getDefault()
,该方法返回IActivityManager
。
(5) AMS 通过调用IApplicationThread
将消息传递给Android app; IApplicationThread
是在Android app调用IActivityManager
的时候传递过去的。
2. 两个Android app通过AMS通信
两个Android app间的通信也是通过AMS完成的,例如App A启动App B的Activity,则App A通过IActivityManager
将消息传给AMS,AMS创建App B的进程和ActivityThread。然后AMS通过IApplicationThread
(蓝色的IApplicationThread)更新App A中Activity的状态(例如从resume到paused),通过IApplicationThread
(棕色的IApplicationThread)创建App B的Activity。
实际过程要比这复杂得多,一旦遇到IActivityManager
和IApplicationThread
的调用,就要切换进程了,清楚的知道当前进程是什么,对理解AMS和ActivityThread的代码有很大的帮助。
3. 例子代码
例如,ContextImpl中的startActivityAsUser()
(代码在下面), 通过ActivityManagerNative.getDefault()
获取到IActivityManager
对象,通过mMainThread.getApplicationThread()
获取到IApplicationThread
对象。
在调用ActivityManagerNative.getDefault().startActivityAsUser
时,将IApplicationThread
对象传给AMS。这样双方就可以方便的通信了。
public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {// 这里去掉了try、catch,以及其他参数 ActivityManagerNative.getDefault().startActivityAsUser( mMainThread.getApplicationThread(), getBasePackageName(), intent, ......); }
更详细的代码,请参考《关于Activity的getReferrer()之二:调用者的包名是如何传给mReferrer的,兼谈startActivity的详细流程》
- Android app 与 ActivityManagerService的通信原理(简化版)
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- Android中ActivityManagerService与应用程序通信模型分析
- Android中ActivityManagerService与应用程序(客户端)通信模型分析
- ActivityManagerService与应用程序通信分析
- Android 7.0 ActivityManagerService(10) App的crash处理
- Android 7.0 ActivityManagerService(10) App的crash处理
- Android ActivityManagerService(AMS)的启动分析
- Android ActivityManagerService(AMS)的进程管理
- Android ActivityManagerService(AMS)的Activity管理
- javascript中的闭包概念
- Leetcode 437. Path Sum III (Easy) (cpp)
- 微星GS73VR 6RF + Linux Mint 18 + GTX1060 + CUDA8.0 + OpenCV3.0.0 + Caffe安装笔记
- Windows 安装 cuteFTP 9.0 并破解
- 配置多个git远程仓库的ssh-Key切换
- Android app 与 ActivityManagerService的通信原理(简化版)
- 199. Binary Tree Right Side View (Medium)
- Notes of Daily Work
- svhost占用内存过高
- OpenTSDB数据写入
- 那你不是也没休息
- 114. Flatten Binary Tree to Linked List (Medium)
- 自己写的C语言通用日志框架,可以控制日志输出等级
- 文章标题