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之外,还有很多方法,有兴趣的可以深入了解一下:
通俗的理解,ActivityThread负责创建这个“家庭”,并负责对外打交道,比如接收
AMS的通知等。Instrumentation负责管理这个家庭,安排每个Activity的日常流程
等工作。
近期评论