Service继承自ContextWrapper,ContextWrapper的startActivity最终调用的是ContextImpl的startActivity,代码如下,会先检查Intent的Flag
@Override
public void startActivity(Intent intent, Bundle options) {
warnIfCallingFromSystemProcess();
if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
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);
}
避免这种异常的办法是设置flag为NEW_TASK或者被启动的Acitivty启动模式设置为singleTask/singleInstance。
为什么呢,个人认为和Activity栈有关,非Activity不需要栈,所以在启动Activity的时候需要保证有创建好的栈,所以需要设置Flag或者启动模式。