Как я понимаю, уничтожаемая деятельность не эквивалентна завершаемой деятельности.
- Закончено
- Действие удаляется из back stack.
- Это может быть вызвано программой (например, вызывая
finish()) или пользователем, нажимая клавишу возврата (которая неявно вызываетfinish()). - Завершение действия уничтожит его.
- Разрушенный
- ОС Android может уничтожить невидимую активность для восстановления памяти. Активность будет воссоздана, когда пользователь перейдет к ней.
- Действие уничтожается и воссоздается, когда пользователь поворачивает экран.
- Ссылка: Восстанавливает активность
Итак как закончить уничтоженное действие? Для метода finish() требуется Activity объект, но если активность разрушена, у меня нет объекта Activity - я не должен ссылаться на уничтоженное действие, я
Пример:
У меня есть активность a, которая начинается с b, которая, в свою очередь, запускает c (используя Activity.startActivity()) поэтому теперь back stack:
a → b → c
В c пользователь заполнит форму и нажмите кнопку "Отправить". Сетевой запрос выполняется на удаленном сервере с помощью AsyncTask. После завершения задачи я покажу toast и закончу операцию, вызвав c.finish(). Совершенная.
Теперь рассмотрим этот сценарий:
Пока выполняется асинхронная задача, пользователь переключается на другое приложение. Затем ОС Android решила уничтожить все 3 действия (a, b, c) из-за ограничений памяти. Позже задача async завершена. Теперь как закончить c?
Что я пробовал:
- Вызов
c.finish():- Невозможно, потому что
cуничтожен.
- Невозможно, потому что
- Вызов
b.finishActivity():- Невозможно, потому что
bуничтожен.
- Невозможно, потому что
-
Используйте
Context.startActivity()сFLAG_ACTIVITY_CLEAR_TOP, чтобы поднятьbк вершине, тем самым завершаяc:// appContext is an application context, not an activity context (which I don't have) Intent intent = new Intent(appContext, B.class); // B is b class. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); appContext.startActivity(intent);- Сбой,
appContext.startActivity()выдает исключение:
- Сбой,
android.util.AndroidRuntimeException: для вызова функции startActivity() извне контекста действия требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?
Изменить: Уточнение: мне нужно дождаться завершения задачи async и решить, завершить ли c на основе ответа сервера.