web-dev-qa-db-ja.com

アクティビティの起動モードがsingleInstanceの場合、onActivityResultは起動しません

基本的に私のメインアクティビティであるアクティビティがあり、その起動モードは単一インスタンスです。ただし、singleInstanceのため、onActivityResult()コールバックは起動しません。また、マニフェストファイルの起動モードを他のモードに変更すると、正常に機能します。

このコールバックが機能しない理由を説明できますか?

27
sajjoo

問題は、singleInstanceが呼び出し先のアクティビティを呼び出し元と同じタスクに存在させないため、呼び出し元に値を返すことができないことだと思います。

代わりにsingleTaskの使用を検討してください。

singleTask

システムは、新しいタスクのルートにアクティビティを作成し、インテントをそのタスクにルーティングします。ただし、アクティビティのインスタンスがすでに存在する場合、システムは、新しいインスタンスを作成するのではなく、onNewIntent()メソッドの呼び出しを介してインテントを既存のインスタンスにルーティングします。

singleInstance

「singleTask」と同じですが、システムがインスタンスを保持しているタスクに他のアクティビティを起動しない点が異なります。アクティビティは常にそのタスクの唯一のメンバーです。

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

47
Pedro Loureiro

アクティビティがsingleInstanceの場合、それはタスク内の唯一のアクティビティになるため、常にタスクの最上位になります。したがって、startActivityForResultを呼び出すと、すぐにコールバックメソッドが起動されます。

5
George

" singleInstance "アクティビティは、他のアクティビティをそのタスクの一部にすることを許可しません。これは、タスクの唯一のアクティビティです。別のアクティビティを開始すると、そのアクティビティは別のタスクに割り当てられます。アクティビティは常にそのタスクの唯一のメンバーです。
onActivityResultsingleInstanceでは機能しないと思います

4

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を返す理由です。

0
Owen

singleInstanceまたはsingleTaskstartActivityForResultメソッドで使用することはできません。

標準モードまたはsingleTop起動モードで問題が解決します。

0
Kirill Vashilo