Ответ 1
Вы не можете использовать startActivityForResult()
, если ваша активность запускается как singleInstance
или singleTask
. standard
или singleTop
режим запуска устранит проблему.
Я запускаю действия из основного действия в своем приложении, используя вызов startActivityForResult(intent, ACTIVITY_TYPE)
, и все они работают, но один.
Этот при вызове запускает действие по желанию, но в журнале я вижу, что onActivityResult()
запускается немедленно. Активность отображается, но RESULT_CANCELED
сразу возвращается в onActivityResult()
.
Затем я взаимодействую с активностью, нажимаю кнопку, которая вызывает finish()
, а onActivityResult()
не вызывается в этот раз (потому что, видимо, результат уже возвращен).
Это имеет смысл для всех? Кто-нибудь видел это поведение раньше?
Вы не можете использовать startActivityForResult()
, если ваша активность запускается как singleInstance
или singleTask
. standard
или singleTop
режим запуска устранит проблему.
Кроме того, убедитесь, что у намерения не установлено значение Intent.FLAG_ACTIVITY_NEW_TASK
.
Ранее я видел это поведение, убедитесь, что ваша активность деструкции (эта специальная деятельность) не является singleInstance
в файле AndroidManifest. Если Activity singleInstance
, то он будет возвращен RESULT_CANCELED
перед запуском!
Я также хотел бы добавить, что вы можете вызвать внешнее приложение с помощью: Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Что создало бы намерение с Intent.FLAG_ACTIVITY_NEW_TASK
, добавленным по умолчанию, так что вызов: in.setFlags(0);
Который очистит этот флаг, а затем вы можете перейти к: startActivityForResult(in, action);
Причина, по которой я делаю это, заключается в том, что у меня есть приложение-утилита с общей функциональностью между несколькими другими приложениями, и я могу сохранить изменения кода в одном месте, а не беспокоиться о нескольких обновлениях.
Моя проблема заключалась в вызове. Его объявление в AndroidManifest имело следующее свойство:
android:noHistory="true"
Изменено на "false" и теперь отлично работает.
startActivityForResult()
не работает с активностью singleInstance
или singleTask
в пред-леллиповой версии Android. Начиная с Android 5 он работает (см. этот ответ для получения более подробной информации).
Он также запускается, если у вас есть FLAG_ACTIVITY_NEW_TASK
в ваших намерениях.
Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
Для ActivityGroup
или TabHost
и других, возможно, xxxActivity
является subActivity
своего родителя. Тогда startActivityForResult
не может работать, но родитель может получить результат.
вызывать getParent().startActivityForResult()
из вашего под-действия
ваш родитель (ActivityGroup
) сможет обрабатывать onActivityResult
. Поэтому я создал подкласс ActivityGroup
и обработал этот onActivityResult
.
Вы можете перенаправить этот результат обратно в под-активность, если вам нужно. Просто введите текущую активность getLocalActivityManager().getCurrentActivity()
. Мои под-действия наследуются от пользовательской активности, поэтому я добавил handleActivityResult(requestCode, resultCode, data)
в этот подкласс для ActivityGroup
для вызова.
example: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html
onActivityResult()
также передаст RESULT_CANCELED
как resultCode
, если вы пропустили пакет или имя класса в файле манифеста.
В Android Manifest установить android:launchMode="singleTop"
для активности, которую вы хотите открыть с результатом и при открытии флага установки активности intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Android 4.4 имеет небольшую проблему с ожиданием возврата в конце закрытия actvity Чтобы решить эту проблему, важно установить:
TaskAffinity = "[SAME STRING]"
)launchmode=singleTop,
launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager
Это решение работает со всей версией Android
Смотрите это для taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072