您的问题的答案是“视情况而定”。
参考文档说不onDestroy
保证会被调用。
注意:不要指望这个方法被称为保存数据的地方!例如,如果一个活动正在内容提供者中编辑数据,那么这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在这里。此方法通常用于释放资源,例如与活动关联的线程,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。
所以,是的,除非 Android 首先销毁该进程,否则您的消息将被调用。
文档还说您必须调用超类实现......
如果您覆盖此方法,则必须调用超类实现。
...但它没有说明应该按什么顺序进行调用。因此,我会查看 Activiy 的源代码,看看它在做什么。这是onDestroy
来自Google Source的(版本 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()
。如果不是,那么顺序无关紧要(除了你的老师告诉你使用什么顺序)。