關於FLAG_ACTIVITY_NEW_TASK的使用

參考文章: https://blog.csdn.net/u010389391/article/details/78558475java

Context調用startActivity, 有部分狀況會報出以下錯誤:android

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
--------------------- 
 app

翻看源碼根據Android的委託機制,ContextWrapper最後是調用了ContextImpl的startActivity方法ide

@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);
    }

 

而這樣的錯誤在Activity是不會發生的,緣由是Activity重寫了這部分的代碼ui

@Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }
@Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }

public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (mParent == null) {
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);

    }

 

總結:this

在Activity上下文以外啓動Activity須要給Intent設置FLAG_ACTIVITY_NEW_TASK標誌,否則會報異常。spa

相關文章
相關標籤/搜索