Как я понимаю, уничтожаемая деятельность не эквивалентна завершаемой деятельности.
- Закончено
- Действие удаляется из 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
на основе ответа сервера.