AMS-Instrumentation解析

0

Instrumentation是什么?和ActivityThread是什么关系?

Instrumentation可以理解为应用进程的管家,ActivityThread要执行创建或暂停某个Activity
等操作时,都需要通过Instrumentation来进行具体的实现(回调Activity的生命周期)。每一
个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。
另外,当我们在Activity中调用startActivity()的 时候,实际上调用的还是Instrumentation的相
关的方法mInstrumentation.execStartActivity()。

   public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        Uri referrer = target != null ? target.onProvideReferrer() : null;
        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
        if (mActivityMonitors != null) {
            synchronized (mSync) {
                final int N = mActivityMonitors.size();
                for (int i=0; i<N; i++) {
                    final ActivityMonitor am = mActivityMonitors.get(i);
                    ActivityResult result = null;
                    if (am.ignoreMatchingSpecificIntents()) {
                        result = am.onStartActivity(intent);
                    }
                    if (result != null) {
                        am.mHits++;
                        return result;
                    } else if (am.match(who, null, intent)) {
                        am.mHits++;
                        if (am.isBlocking()) {
                            return requestCode >= 0 ? am.getResult() : null;
                        }
                        break;
                    }
                }
            }
        }
        try {
            intent.migrateExtraStreamToClipData(who);
            intent.prepareToLeaveProcess(who);
            int result = ActivityTaskManager.getService().startActivity(whoThread,
                    who.getBasePackageName(), who.getAttributionTag(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()), token,
                    target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

ActivityManagerNative.getDefault返回的就是ActivityManagerService的远程接
口,即ActivityManagerProxy。
除了启动Activity之外,还有很多方法,有兴趣的可以深入了解一下:

file

通俗的理解,ActivityThread负责创建这个“家庭”,并负责对外打交道,比如接收
AMS的通知等。Instrumentation负责管理这个家庭,安排每个Activity的日常流程
等工作。