1

在 Destroy 之后,我打印了一条 Log 语句,日志会显示为应用程序已经被破坏,并且在应用程序被破坏后无法执行任何指令。

    @Override
protected void onDestroy() {
    super.onDestroy();
    Log.v(TestActivity,"App is currntly getting destroyed")
}

那么“应用程序当前正在被销毁”会被打印吗?如果它不会被打印,那么我如何在 onDestroy 方法中执行代码?

4

3 回答 3

3

您的问题的答案是“视情况而定”。

参考文档说不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()。如果不是,那么顺序无关紧要(除了你的老师告诉你使用什么顺序)。

于 2017-11-13T11:19:06.850 回答
0

super.onDestory()在您的代码执行后调用。

@Override
protected void onDestroy() {
    Log.v(MainActivity,"App is currntly getting destroyed")
    super.onDestroy();
}

如果应用程序被android销毁以进行内存分配,它也不会被调用。最好使用onStop()方法来保存您的数据。

于 2017-11-13T10:21:45.033 回答
0

不能保证 onDestroy() 总是会调用。您可以在 onStop() 方法中进行清洁工作。

于 2017-11-13T10:22:03.473 回答