非Activity下跳转Activity的问题

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或者启动模式。

你可能感兴趣的:(Android知识点)