在Destroy之后,我打印一个Log语句,当应用程序被销毁时,日志会显示,因为应用程序已被销毁,并且无法执行任何指令。
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TestActivity,"App is currntly getting destroyed")
}
那么“应用程序目前正在被破坏”会被打印出来吗? 如果它不会被打印,那么如何在onDestroy方法中执行代码?
答案 0 :(得分:2)
你的问题的答案是,"它取决于"。
reference documentation表示无法保证调用onDestroy
。
注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应将其用于执行过程消失后要保留的内容。
所以,是的,您的消息将被称为,除非Android首先破坏该流程。
文档还说明必须调用超类实现...
如果覆盖此方法,则必须调用超类实现。
...但它并没有说明应该拨打什么电话。因此,我会看看Activiy源,看看它在做什么。以下是来自Google Source的onDestroy
的(版本de jour)源代码。
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()
之前调用您的代码。如果没有,那么订单并不重要(除了您的老师告诉您使用的订单)。
答案 1 :(得分:0)
执行代码后调用super.onDestory()
。
@Override
protected void onDestroy() {
Log.v(MainActivity,"App is currntly getting destroyed")
super.onDestroy();
}
如果Android为内存分配销毁了应用程序,也不会调用它。
最好使用onStop()
方法来保存数据。
答案 2 :(得分:0)
不能保证onDestroy()始终会调用。你可以用onStop()方法做清洁工作。