2014-07-30 4 views
3

В моей деятельности я перегрузил onDestory() и просто поместил вызов журнала, чтобы показать, вызван ли этот метод. (Проверено на Android 4.2.2 и 4.4.4)onDestroy() вызывается, когда нажата кнопка «Назад»

@Override 
protected void onDestroy() { 
    Log.i(TAG, "onDestroy() was called"); 
    super.onDestroy(); 
} 

Когда я нажимаю кнопку назад, этот метод вызывается (Я видел журнал).

Я считаю, что этого не должно произойти, если телефон не получает памяти или что-то в этом роде. У меня нет ничего особенного в приложении, кроме MainActivity и некоторых фрагментов.

Вот журнал, когда пользователь находится в MainActivity и нажимает на кнопку назад:

I/MainActivity? onBackPressed() was called 
I/MainActivity? onStop() was called 
I/MainActivity? onDestroy() was called 

Почему это происходит?

Я также проверил для isFinishing() в onPause() и она всегда возвращает true

Из Javadoc:

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

+1

Нононо, вы поняли, что это неправильно. Он вызывается, когда «Активность» уничтожается, а в простейшем случае, когда вы закрываете его, нажимая кнопку «Назад». См. [Жизненный цикл активности] (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle) для получения дополнительной информации. –

+0

@AndrewT.Java-документ говорит, что это может произойти. он не говорит, что это произойдет. это смущает! –

+0

И довольно забавно возникает вопрос в SO, спрашивающий, почему onDestroy не вызван на спину нажатой! –

ответ

6

При нажатии кнопки назад внутри Activity, он будет вызывать finish(), который будет «закрыть» его

!.

/** 
* Called when the activity has detected the user's press of the back 
* key. The default implementation simply finishes the current activity, 
* but you can override this to do whatever you want. 
*/ 
public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

Когда это происходит, onDestroy() может (и обычно) можно назвать.

защищен недействительный OnDestroy()

Выполните любую окончательную очистку перед тем, как активностью разрушается. Это может произойти либо потому, что активность завершается (кто-то называется finish() на нем, либо потому, что система временно уничтожает этот экземпляр активности, чтобы сэкономить место. Вы можете различать эти два сценария с помощью метода isFinishing().

по той же причине также идет о том, почему положить isFinishing() внутри onPause() всегда возвращает true, при нажатии на кнопку назад (вызов finish()). Он не вернется true если вы скрыть Activity с другим способом, например, нажав кнопка дома.

+0

Спасибо за подробный ответ! –

Смежные вопросы