簡體   English   中英

如果活動的啟動模式為singleInstance,則不會觸發onActivityResult

[英]onActivityResult do not fire if launch mode of activity is singleInstance

我有一個Activity,它基本上是我的主要活動,它的啟動模式是單個實例。 但由於singleInstance, onActivityResult()回調不會觸發。 如果我將清單文件中的啟動模式更改為任何其他模式,它可以正常工作。

你能解釋為什么這個回調不起作用嗎?

我認為問題是singleInstance不會讓被調用者活動與調用者存在於同一個任務中,因此它無法將值返回給調用者。

考慮使用singleTask:

singleTask

系統在新任務的根目錄下創建活動,並將意圖路由到該任務。 但是,如果活動的實例已存在,系統會通過調用其onNewIntent()方法將意圖路由到現有實例,而不是創建新實例。

singleInstance

與“singleTask”相同,但系統不會在持有實例的任務中啟動任何其他活動。 活動始終是其任務的唯一成員。

http://developer.android.com/guide/topics/manifest/activity-element.html

如果活動是singleInstance ,它將是任務中唯一的活動,因此它始終是任務的頂部。 因此,當您調用startActivityForResult ,它將立即觸發回調方法。

singleInstance ”活動不允許其他任何活動成為其任務的一部分。 這是任務中唯一的活動。 如果它啟動另一個活動,則該活動將分配給另一個任務。 活動始終是其任務的唯一成員。
我認為onActivityResult不適用於singleInstance

您不能將singleInstancesingleTaskstartActivityForResult方法一起使用。

標准模式或singleTop啟動模式將解決問題。

Android源代碼

檢查“ActivityStarter.computeLaunchingTaskFlags()”方法:

            } else if (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) {
            // The original activity who is starting us is running as a single
            // instance...  this new activity it is starting must go on its
            // own task.
            mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;

這就是為什么在使用單實例啟動模式的原始活動時添加NEW_TASK標志的原因。

更多源代碼

檢查“ActivityStarter.sendNewTaskResultRequestIfNeeded()”方法:

        if (sourceStack != null && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
        // For whatever reason this activity is being launched into a new task...
        // yet the caller has requested a result back.  Well, that is pretty messed up,
        // so instead immediately send back a cancel and let the new task continue launched
        // as normal without a dependency on its originator.
        Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
        sourceStack.sendActivityResultLocked(-1 /* callingUid */, mStartActivity.resultTo,
                mStartActivity.resultWho, mStartActivity.requestCode, RESULT_CANCELED,
                null /* data */);

這就是FLAG_ACTIVITY_NEW_TASK始終立即返回RESULT_CANCELED的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM