Context子類螟碎,例如ContextImpl.java中的實現(xiàn),會檢查有沒有設(shè)置Flag:FLAG_ACTIVITY_NEW_TASK藐俺,否則會報錯百拓,這就是Application和Service中的context不可以直接啟動Activity的原因。
```java
@Override
? ? public void startActivity(Intent intent, Bundle options) {
? ? ? ? warnIfCallingFromSystemProcess();
? ? ? ? // Calling start activity from outside an activity without FLAG_ACTIVITY_NEW_TASK is
? ? ? ? // generally not allowed, except if the caller specifies the task id the activity should
? ? ? ? // be launched in. A bug was existed between N and O-MR1 which allowed this to work. We
? ? ? ? // maintain this for backwards compatibility.
? ? ? ? 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);
? ? }
```