Могу ли я определить, уничтожил ли 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
    }
}