Восстановить действия убийцы задач формы или очистить кеш

Я хочу, чтобы мое приложение восстанавливалось после действий таск-киллера или очистки кеша. Сценарий ниже;

  1. запустить приложение
  2. нажмите кнопку домой
  3. убейте все приложения (или очистите кеш)
  4. запустить приложение из последней задачи

После этого сценария приложение вылетит. Я заметил, что если приложение убито с помощью приложений-убийц задач или путем очистки кеша, приложение не будет уничтожено должным образом. Часть его памяти удаляется, но последнее состояние сохраняется в недавних задачах. Поэтому, когда пользователь пытается открыть приложение из последних задач, приложение аварийно завершает работу из-за потери некоторых глобальных или статических переменных.

Раздражает эта ситуация; Метод onDestroy() не вызывается после действия таск-киллера или очистки кеша. (у моего приложения есть одна основная активность FragmentActivity, а другие фрагменты контролируются этой основной активностью, поэтому, если я могу обнаружить onDestroy() моей активности, я могу правильно ее убить)

Любые идеи о том, как решить эту проблему? Заранее спасибо.


person mkeremkeskin    schedule 26.09.2013    source источник


Ответы (2)


Я решаю эти проблемы, используя различия жизненного цикла.

если нажата кнопка «Домой», вызывается onStop(), но если приложение закрыто, вызываются как onStop(), так и onDestroy(), что означает, что если задача завершается, когда она находится в фоновом режиме, onDestroy() не вызывается. Я отслеживаю этот сценарий через sharedPreferences.

@Override
protected void onStop() {
    SharedPreferencesUtilities.putBoolean("isFromOnStop", true);
    super.onStop();
}

@Override
protected void onDestroy() {
    SharedPreferencesUtilities.putBoolean("isFromOnStop", false);
    super.onDestroy();
    android.os.Process.killProcess(android.os.Process.myPid());
}  

Затем в onCreate() я проверил это логическое значение sharedPreferences;

if(SharedPreferencesUtilities.getBoolean("isFromOnStop", false)) {
    SharedPreferencesUtilities.putBoolean("isFromOnStop", false);
        ((MainFragmentActivity)mContext).finish();
        Toast.makeText(mContext, "Ooops app was killed in background", Toast.LENGTH_SHORT).show();
}
person mkeremkeskin    schedule 01.10.2013

Проблема в существовании тасккиллеров: они бесполезны, ИМХО. Дополнительную информацию см. на этой странице.

person JJ86    schedule 26.09.2013
comment
Каким бы ни было ваше мнение о таск-киллерах, все еще существует проблема в состоянии приложения, когда оно возобновляет работу после того, как оно было убито таск-киллером. - person rajath; 20.11.2015
comment
@rajath, и это причина понижения голоса? Если вы убьете приложение, чего вы ожидаете? Если его убивает система Android, проблема остается? - person JJ86; 20.11.2015