public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
startActivityForResult(intent, -1);
}
}
都是走到 startActivityForResult()
中去,其中第一个参数为在Launcher中创建的Intent,第二个参数-1表示Launcher不需要知道Activity启动的结果。也就是说Lancher只管发请求,之后怎么样就再也不处理了。我们来看看 startActivityForResult()
的代码:
// Acitvity.java
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
// 1
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
…
} else {
…
}
}
注释1:如果mParent==null 则往下走execStartActivity()
mParent是当前Activity的父类,因为根Activity还没有创建出来,所以mParent就是null。
接着调用 Instrumentation
类的 execStartActivity()
,传入参数:this(上下文)、但前应用主线程、token、this(上下文)、Launcher来的intent、requstCode(-1,表示无需知道后面的结果)、携带参数bundle。
接着我们来看看 Instrumentation
这个类的启动Activity的方法:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String target,
Intent intent, int requestCode, Bundle options) {
…
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), //1
token, target, requestCode, 0, null, options);
checkStartActivityResult(result, intent); //2
} catch (RemoteException e) {
throw new RuntimeException(“Failure from system”, e);
}
return null;
}
在 try{}
中,先修改一下intent的内容。
其次在注释1中:调用 ActivityManager.getService().startActivity()
一套组合拳。
这条代码先从 ActivityManager.getService()
获取AMS在Client端的代理对象。也就是说,它会返回个可以看做是 AMS
的对象。
然后调用其 startActivity()
,也就是调用 ASM.startActivity()
。
我们先不进入到AMS的startActivity去,而是看看这个 AMS是怎么来的。
在Android8.0之前,是通过 ActivityManagerNative.getDefaul()
来获取AMS的代理对象的,现在这个逻辑放到了 ActivityManager
中而不是 ActivityManagerNative
中,在我之前做的笔记《Android艺术探索》这本书里面,用的是7.0的代码,可以看下面:
我们来看看getServcie的代码:
// AcitvityManager.java
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
这个方法返回一个IActivityManager
的对选哪个,有了解AIDL或代理模式的应该就能立马知道 IActivityManager
是ActivityManagerService
在客户端的代理类!
我们来看看 IActivityManagerSingleton
的get()
:
// ActivityManager.java
private static final Singleton IActivityManagerSingleton =
new Singleton() {
@Override
protected IActivityManager create() {
//1
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
//2
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
注释1:从 ServiceManager得到一个IBinder,也就是 “IBinder类型的AMS”
注释2:将IBinder通过 asInterface()
转换成一个 IActivityManager对象,通过get()
可以得到这个对象。
上面是 AIDL
的做法,用 进程间通信完成的从 客户端层到 服务端层的实现。8.0之前并不是AIDL的做法。至于AIDL的用法、原理网上已经有n多的blog去学习了。这里不再赘述。
至此,第一阶段结束,execStartActivity
方法最终会调用到 ActivityManagerService.startActivity()
。
这部分其实特别好理解。
=======================================================