onActivityResult С launchMode = “singleTask”?

При попытке startActivityForResult для Activity который имеет launchMode="singleTask" ; он не будет возвращать значения с помощью onActivityResult , а когда вы установите launchMode="standard" ; все работает нормально, но системные требования говорят, что эта Activity должна быть singleTask , есть ли все равно, чтобы решить эту проблему?

Документы startActivityForResult говорят:

 For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result. 

Кажется, нет никакого способа обойти это.

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

Ответ показывает в функции startActivityUncheckedLocked classа ActivityStackSupervisor . Перед Android 5.x, при запуске действия, он сначала проверит startMode и добавит FLAG_ACTIVITY_NEW_TASK в launchFlags, если launchMode – singleTask или singleInstance. Если флаги FLAG_ACTIVITY_NEW_TASK Activity содержат FLAG_ACTIVITY_NEW_TASK , он немедленно отправит ответ и начнет FLAG_ACTIVITY_NEW_TASK , как обычно, без зависимости от его создателя.

 if (sourceRecord == null) { // This activity is not being started from another... in this // case we -always- start a new task. if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { Slog.w(TAG, "startActivity called from non-Activity context; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } } else if (sourceRecord.launchMode == ActivityInfo.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. launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { // The activity being started is a single instance... it always // gets launched into its own task. launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; } // ...... if (r.resultTo != null && (launchFlags&Intent.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."); r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, r.requestCode, Activity.RESULT_CANCELED, null); r.resultTo = null; } 

Но в Android 5.x это было изменено следующим образом:

 final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP; final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE; final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK; int launchFlags = intent.getFlags(); if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && (launchSingleInstance || launchSingleTask)) { // We have a conflict between the Intent and the Activity manifest, manifest wins. Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " + "\"singleInstance\" or \"singleTask\""); launchFlags &= ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } else { switch (r.info.documentLaunchMode) { case ActivityInfo.DOCUMENT_LAUNCH_NONE: break; case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING: launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; break; case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS: launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; break; case ActivityInfo.DOCUMENT_LAUNCH_NEVER: launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK; break; } } final boolean launchTaskBehind = r.mLaunchTaskBehind && !launchSingleTask && !launchSingleInstance && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0; if (r.resultTo != null && (launchFlags & Intent.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."); r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, r.requestCode, Activity.RESULT_CANCELED, null); r.resultTo = null; } 

Вот почему onActivityResult работает в Android 5.x, даже вы устанавливаете launchMode в singleTask или singleInstance .

Что говорит @Петер Кнего

плюс

он работает в 5.1, а не в 4.4.4

это означает, что onActivityResult пожары

Я знаю, что это довольно поздно, но вы можете иметь эффект OnActivityResult для метода onNewIntent (), потому что это ваша активность singleTask.

  • Android получает предыдущую активность
  • В чем разница между Явным и неявным вызовом активности в android?
  • Как передать значения из одной активности в предыдущую деятельность
  • Могу ли я создать объект активности в другом classе?
  • Android: как проверить, запущена ли работа?
  • как убить вспомогательные действия и довести активность до стека
  • Android уничтожает деятельность, убивает процессы
  • Передача JSONObject в другое действие
  • Как передать объект из одной активности в другую на Android?
  • Изменить начальную активность приложения
  • Помощь с передачей ArrayList и разумной активностью
  • Давайте будем гением компьютера.