非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または起動されたActivity起動モードはsingleTask/singleInstanceに設定されます.なぜかというと、個人的にはActivityスタックに関係していると思いますが、非Activityはスタックを必要としないので、Activityを起動する際に作成したスタックがあることを保証する必要があるので、Flagまたは起動モードを設定する必要があります.