onActivityResult не запускается, если режим запуска активирован в одном экземпляре - PullRequest
27 голосов
/ 25 февраля 2011

У меня есть Активность, которая в основном является моей основной активностью, а режим запуска - один экземпляр.Но из-за singleInstance обратный вызов onActivityResult() не срабатывает.И если я изменю режим запуска в моем файле манифеста на любой другой режим, он будет работать нормально.

Можете ли вы объяснить, почему этот обратный вызов не работает?

Ответы [ 5 ]

47 голосов
/ 25 февраля 2011

Я полагаю, что проблема в том, что singleInstance не позволяет активности вызываемого пользователя существовать в той же задаче, что и вызывающий объект, поэтому он не может вернуть значение вызывающему элементу.

Попробуйте вместо этого использовать singleTask:

singleTask

Система создает действие на корень новой задачи и маршруты Намерение к этому. Тем не менее, если экземпляр деятельности уже существует, Система направляет намерение к существующему экземпляр через вызов его метод onNewIntent (), а не создание нового.

SingleInstance

То же, что и "singleTask", за исключением того, что система не запускает другие деятельность в задачу проведения пример. Деятельность всегда единственный и единственный член своей задачи.

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

5 голосов
/ 29 января 2012

Если задание равно singleInstance, оно будет единственным в задаче, поэтому оно всегда будет верхом задания. Поэтому, когда вы вызываете startActivityForResult, он немедленно вызывает метод обратного вызова.

4 голосов
/ 25 февраля 2011

Операция " singleInstance " не разрешает другим действиям участвовать в ее задаче. Это единственное занятие в задании. Если он запускает другое действие, то это действие назначается другой задаче. Деятельность всегда является единственным и единственным участником своей задачи.
Я думаю onActivityResult не будет работать с singleInstance

0 голосов
/ 24 апреля 2018

Исходный код 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 голосов
/ 23 февраля 2018

Вы не можете использовать singleInstance или singleTask с методом startActivityForResult.

Стандартный режим или режим запуска с одним рабочим столом решит проблему.

...