Android app 与 ActivityManagerService的通信原理(简化版)

1. Android app 与 ActivityManagerService的通信原理(简化版)

Android 的app与 ActivityManagerService (以下简称AMS)的通信是这样的:

Android app 与 ActivityManagerService的通信原理(简化版)_第1张图片

对上图的简单说明:

(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。

实际过程要比这复杂得多,一旦遇到IActivityManagerIApplicationThread的调用,就要切换进程了,清楚的知道当前进程是什么,对理解AMS和ActivityThread的代码有很大的帮助。

Android app 与 ActivityManagerService的通信原理(简化版)_第2张图片

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)