如果在onDestroy之后有一条指令,那么指令会被执行吗?

时间:2017-11-13 10:19:43

标签: java android android-studio ondestroy android-ondestroy

在Destroy之后,我打印一个Log语句,当应用程序被销毁时,日志会显示,因为应用程序已被销毁,并且无法执行任何指令。

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

那么“应用程序目前正在被破坏”会被打印出来吗? 如果它不会被打印,那么如何在onDestroy方法中执行代码?

3 个答案:

答案 0 :(得分:2)

你的问题的答案是,"它取决于"。

reference documentation表示无法保证调用onDestroy

  

注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应将其用于执行过程消失后要保留的内容。

所以,是的,您的消息将被称为,除非Android首先破坏该流程

文档还说明必须调用超类实现...

  

如果覆盖此方法,则必须调用超类实现。

...但它并没有说明应该拨打什么电话。因此,我会看看Activiy源,看看它在做什么。以下是来自Google SourceonDestroy的(版本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()方法做清洁工作。