Activity 继承自 ContextThemeWrapper 和 ContextWrapper,基类是 Context,重写了 ContextWrapper 的 startActivity()。
1,Activity 的 startActivity() 方法,通过 Instrumentation 类,执行 IActivityTaskManager 的startActivity() 方法。
ActivityTaskManager.getService().startActivity()
2,Context 的 startActivity() 抽象方法。
public abstract void startActivity(@RequiresPermission Intent intent);
在 ContextImpl 实现类。
@Override
public void startActivity(Intent intent, Bundle options) {
warnIfCallingFromSystemProcess();
final int targetSdkVersion = getApplicationInfo().targetSdkVersion;
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
&& (targetSdkVersion < Build.VERSION_CODES.N
|| targetSdkVersion >= Build.VERSION_CODES.P)
&& (options == null
|| ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
+ " Is this really what you want?");
}
mMainThread.getInstrumentation().execStartActivity(
getOuterContext(), mMainThread.getApplicationThread(), null,
(Activity) null, intent, -1, options);
}
查询 Intent 是否存在 flag: FLAG_ACTIVITY_NEW_TASK,否则报出异常。
当 Service 或者 BroadcastReceiver 调用 startActivity() 方法时,二者未重写此方法,调用
ContextWrapper 的 startActivity() 方法 。
@Override
public void startActivity(Intent intent) {
mBase.startActivity(intent);
}
即调用 ContextImpl 类启动方法 。
任重而道远
网友评论