概述
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的通信原理(简化版)1. Android app 与 ActivityManagerService的通信原理(简化版)2. 两个Android app通过AMS通信3. 例子代码的全部内容,希望文章能够帮你解决Android app 与 ActivityManagerService的通信原理(简化版)1. Android app 与 ActivityManagerService的通信原理(简化版)2. 两个Android app通过AMS通信3. 例子代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复