Как определить, запущено ли действие для обработки onActivityResult или было запущено просто воссоздать действие из-за изменения ориентации или другого события.
Я начинаю действие A, и если условие выполняется, я запускаю действие B, для которого обрабатываю результат в A.
В ситуациях с нехваткой памяти действие A уничтожается и воссоздается для обработки результата от B. Во время onInit мое внутреннее состояние показывает, что мне все еще нужно отображать действие B, и, таким образом, B отображается повторно.
Как я мог справиться с этим правильно?
2 ответа
Отредактировано, чтобы попытаться ответить на фактический вопрос.
Чтобы предотвратить запуск кода установки при возврате к действию, вы можете воспользоваться методом onSaveInstanceState
. Вы можете переопределить этот метод в классе A
, чтобы, если ваше действие было прекращено по какой-либо причине, вы могли сохранить его состояние (например, тот факт, что вы уже начали действие B
для получения результата) . В этом методе вы изменяете переданный в Bundle
, задавая для него пары "ключ-значение". Этот пакет затем будет передан классу onCreate
при перезапуске действия. Таким образом, соответствующие части вашего класса A могут выглядеть следующим образом:
public class A extends Activity {
boolean startedB = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
startedB = savedInstanceState != null && savedInstanceState.getBoolean("started_b", false);
if (!startedB) {
Intent intent = new Intent(this, B.class);
startActivityForResult(intent, 1);
startedB = true;
}
// rest of code
// .....
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean("started_b", startedB);
}
}
Исходный ответ
Когда вы начинаете действие для получения результата, вы можете установить дополнительный флаг или значение для намерения, используемого для запуска действия. Например, если я хочу начать действие Foo
для получения результата, я могу использовать
Intent intent = new Intent(this, Foo.class);
intent.putExtra(IS_FOR_RESULT, true);
startActivityForResult(intent, REQUEST_CODE);
Где IS_FOR_RESULT
- это строка, например "IS_FOR_RESULT"
, а REQUEST_CODE
- целое число, например 1
. В запущенном действии onCreate
(в данном случае для класса Foo
) вы можете проверить, было ли оно запущено, для получения результата с помощью следующих
Intent intent = getIntent();
if (intent.hasExtra(IS_FOR_RESULT) && intent.getBooleanExtra(IS_FOR_RESULT) {
// Handle activity being started for a result
}
Исходя из того, что вы сказали, вы также можете захотеть провести аналогичную проверку в запущенном классе onNewIntent
на случай, если вы запускаете существующее действие для получения результата, и оно не создает его новый экземпляр.
В общем, намерения и дополнительные возможности намерений являются полезными инструментами для передачи информации о конкретном экземпляре. между компонентами приложения.
Вы можете определить, было ли действие запущено для результата только в вашем приложении , реализовав логику, предложенную FuegoFro. Однако вы не можете определить, каким образом ваша Activity была запущена из других приложений. Это можно сделать из исходных кодов Android: единственная разница между запуском Activity для результата и его запуском - это значение requestCode
:
@Override
public void startActivity(Intent intent) {
startActivityForResult(intent, -1);
}
И этот requestCode
недоступен из вашего Activity.
Похожие вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .