Могу ли я определить, уничтожил ли Android приложение (процесс задачи) из Intent In / PendingIntent?
ОС Android убивает процессы, когда у нее мало памяти. Сценарий: Android убивает процесс приложения, и я снова открываю его через панель запуска Android или список недавних задач (долгое нажатие кнопки домой). Я могу проверить, уничтожил ли Android мой процесс приложения в методе onCreate() последней просмотренной активности, используя:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
// Re-initialise things that killing the app would have destroyed
}
}
Однако, если Android убивает процесс приложения и я заново открываю его с помощью Уведомления с помощью Intent, упакованного в PendingIntent, я не знаю, как определить, был ли процесс приложения убит Android. Впоследствии я не переинициализирую то, что уничтожило бы процесс приложения.
Есть ли способ определить, уничтожил ли Android процесс приложения при открытии нового действия из уведомления?
Я нашел одно хакерское решение этой проблемы. Использование: Android: всегда запускать верхнюю активность при щелчке на уведомлении. Я могу открыть активность в верхней части стека, которому передается saveInstanceState, если Android убил процесс приложения и занялся повторной инициализацией. Каждое действие затем отвечает за перенаправление пользователя к соответствующему действию, используя дополнительные функции в исходном Намерении уведомления. Намерение настройки для этого сценария ниже:
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
Можно ли установить действие, категорию или флаг для намерения, которое будет эмулировать повторное открытие процесса приложения, как если бы оно было выполнено пользователем, но для нового намерения / действия?
РЕДАКТИРОВАТЬ: чтобы прояснить последний вопрос (хотя кажется, что мое детское понимание Android меня подводит, поэтому, вероятно, это не имеет смысла): есть ли действие, категория или флаг, которые я могу установить в намерении, как в приведенном выше фрагменте, это позволит мне определить, был ли процесс приложения убит ОС?
2 ответа
Самый простой способ определить, убил ли Android процесс и затем создал новый процесс, заключается в следующем:
В вашей корневой Activity (с ACTION=MAIN и CATEGORY=DEFAULT) создайте открытую статическую логическую переменную, подобную этой:
public static boolean initialized;
в onCreate()
вашей корневой активности, установите эту переменную в true
,
В onCreate()
из всех других ваших действий вы можете проверить, убила ли Android / воссоздала задачу, проверив состояние логического значения, и, если приложение не было инициализировано, вы можете перенаправить в корневую активность или вызвать метод инициализации или любой другой... как это:
if (!RootActivity.initialized) {
// Android has killed and recreated the process and launched this
// Activity. We need to reinitialize everything now
... redirect to root activity or call reinitialize method
}
Поскольку идентификатор процесса изменится, когда приложение будет убито и перезапущено, вы можете использовать это, чтобы проверить это:
В onSaveInstanceState(Bundle outState)
получить текущий идентификатор процесса и сохранить его в outState:
onSavedInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("my_pid", Process.myPid());
}
Затем в onCreate(Bunde savedInstanceState)
сравните сохраненный идентификатор процесса и текущий идентификатор процесса:
onCreate(Bundle savedInstanceState){
if(savedInstanceState!=null){
if(savedInstanceState.getInt("my_pid",-1)==android.os.Process.myPid())
// app was not killed
else
// app was killed
}
}