在api26中,ActivityManagerNative类已经被弃用,同时代理类ActivityManagerProxy也被删除了。
Instrumentation类的execStartActivity方法如下,注意注释1处。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String resultWho,
Intent intent, int requestCode, Bundle options, UserHandle user) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
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();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService() //1
.startActivityAsUser(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, resultWho,
requestCode, 0, null, options, user.getIdentifier());
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
api 25中Instrumentation类的的execStartActivity方法如下,注意注释2处。
1 | public ActivityResult execStartActivity( |
我们看到,在注释1处和注释2处代码不一样,接下来继续看不同部分的代码,api26:1
2
3
4
5
6
7
8
9
10
11
12
13public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
api25:1
2
3static public IActivityManager getDefault() {
return gDefault.get();
}
1 | private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { |
这两个地方的代码返回的都是IActivityManager对象。但是不同的是:api25中使用的是静态方法asInterface,该方法属于ActivityManagerNative。asInterface的源码如下:1
2
3
4
5
6
7
8
9
10
11
12static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in =
(IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
参考文章:Activity启动过程详解 说明了ActivityManagerNative类,还有ActivityManagerProxy类(已被移除),是如何实现和AMS进程通信的,最终使用了ActivityManagerProxy代理类实现了startActivity。
参考文章:ActivityManagerProxy已经被删除
api26使用的是:
1 | IActivityManager.Stub.asInterface(b); |
再看api26中的ActivityManagerNative源码:
1 | /** |
“@deprecated will be removed soon. See individual methods for alternatives. “上面注释说明这个类将会被弃用,我们可以用ActivityManager来替代,而且ActivityManagerProxy已经被删除了。
api26及以后启动activity时候,和AMS通信已经采用了AIDL方式。实际上api25和api26及之后,启动Activity启动Activity的时候,和AMS通信调用的也是queryLocalInterface,他们的实质还是一样的。
api26及之后只有ServiceManagerNative还没有被弃用,api25的:ApplicationThreadNative、ActivityManagerNative、BulkCursorNative、ContentProviderNative都已经不再使用了。
这两句代码:mInstrumentation.execStartActivity,mMainThread.sendActivityResult。是activity启动过程中很重要的核心逻辑。
在ActivityThread中一个Activity被启动时相关方法是这样的:schedule–>handle–>perform–>activity/Insturmation。