Подтвердить что ты не робот

Активность Android onDestroy() не всегда вызывается, и если вызывается только часть кода, выполняется

onDestroy() не всегда вызывается. При вызове выполняется только часть кода. И большую часть времени в LogCat я вижу только сообщение "состояние gps при уничтожении вызвано первым". Почему это так?

protected void onDestroy() {
    super.onDestroy();
    Log.d("on destroy called", "gps state on destroy called first");

    editor.putBoolean("gpsOn", false);
    Log.d("on destroy called", "gps state on destroy called second");
    editor.commit();

    Log.d("on destroy called", "gps state on destroy called third");
    stopRouteTracking();
    Log.d("on destroy called", "gps state on destroy called  fourth");
}
4b9b3361

Ответ 1

Посмотрите на это:

Деятельность OnDestroy никогда не вызывал?

И это:

http://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

По сути, никогда не гарантируется, что будет вызван onDestroy(), и в некоторых случаях такие процессы, как ваше приложение, будут уничтожены напрямую, в любом случае, минуя вызов метода.

Ответ 2

В документации разработчика Android здесь, вы можете видеть, что -

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

и onStop() и onDestroy() оба отмечены как killable.

Это может быть причиной того, что только часть кода, написанного в onDestroy(), вызывается, поскольку процесс может быть уничтожен в любой момент после выполнения onStop().

Ответ 3

@Критический ответ правильный, однако ваша проблема, когда вызывается только часть вашего кода, может возникнуть из вызова super.onDestroy() перед вызовом вашего кода. super.onDestroy() должен быть вызван в конце, потому что тогда ваш код будет вызван до его уничтожения.