Если после onDestroy есть Инструкция, будет ли Инструкция выполнена?
Здесь, после "Разрушения", я печатаю инструкцию "Журнал", будет ли отображаться "Журнал", поскольку приложение уже уничтожено, и после уничтожения приложения невозможно выполнить инструкцию.
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TestActivity,"App is currntly getting destroyed")
}
Так будет ли напечатано "Приложение разрушается"? Если он не будет напечатан, как я могу выполнить код в методе on Destroy?
3 ответа
Ответ на ваш вопрос: "Это зависит".
Справочная документация гласит, что onDestroy
не гарантированно будет вызван.
Примечание: не рассчитывайте, что этот метод вызывается как место для сохранения данных! Например, если действие редактирует данные в поставщике контента, эти изменения должны быть зафиксированы либо в onPause(), либо в onSaveInstanceState(Bundle), а не здесь. Этот метод обычно реализуется для освобождения ресурсов, таких как потоки, которые связаны с действием, так что уничтоженное действие не оставляет таких вещей, пока остальная часть его приложения все еще выполняется. Существуют ситуации, когда система просто убивает процесс хостинга действия, не вызывая этот метод (или любой другой) в нем, поэтому его не следует использовать для выполнения действий, которые должны остаться после завершения процесса.
Так что, да, ваше сообщение будет вызываться, если Android не разрушит процесс первым.
Документация также говорит, что вы должны обратиться к реализации суперклассов...
Если вы переопределите этот метод, вы должны обратиться к реализации суперкласса.
... но это не говорит, в каком порядке должен быть сделан звонок. Из-за этого я бы посмотрел на источник Activiy, чтобы увидеть, что он делает. Вот (version de jour) исходный код для onDestroy
из источника Google.
protected void onDestroy() {
mCalled = true;
// dismiss any dialogs we are managing.
if (mManagedDialogs != null) {
final int numDialogs = mManagedDialogs.size();
for (int i = 0; i < numDialogs; i++) {
final ManagedDialog md = mManagedDialogs.valueAt(i);
if (md.mDialog.isShowing()) {
md.mDialog.dismiss();
}
}
mManagedDialogs = null;
}
// close any cursors we are managing.
synchronized (mManagedCursors) {
int numCursors = mManagedCursors.size();
for (int i = 0; i < numCursors; i++) {
ManagedCursor c = mManagedCursors.get(i);
if (c != null) {
c.mCursor.close();
}
}
mManagedCursors.clear();
}
// Close any open search dialog
if (mSearchManager != null) {
mSearchManager.stopSearch();
}
}
Хотя это может измениться в любое время, мы можем видеть, что onDestroy
в суперклассе будут убирать ресурсы (как написано в документации). Итак, ваша реализация onDestroy
полагаться на любой из этих ресурсов? Это будет диктовать, что ваш код должен быть вызван раньше super.onDestroy()
, Если нет, то порядок не имеет значения (за исключением того, что ваш учитель сказал вам, какой порядок использовать).
Не гарантируется, что onDestroy() будет вызываться всегда. Вы можете выполнить очистку в методе onStop().
Позвоните super.onDestory()
после того, как ваш код выполнен.
@Override
protected void onDestroy() {
Log.v(MainActivity,"App is currntly getting destroyed")
super.onDestroy();
}
Также он не будет вызываться, если приложение уничтожено андроидом для выделения памяти. Лучше использовать onStop()
способ сохранить ваши данные.