【问题标题】:activity finishes itself but onDestroy() call for this activity happen so late活动自行完成,但对此活动的 onDestroy() 调用发生得太晚了
【发布时间】:2017-11-22 08:40:38
【问题描述】:

我在我们的代码中发现了一个错误,我们正在通过

启动活动(我们称之为 SCREEN_ACTIVITY)
Intent intent = new Intent(SharedIntents.INTENT_SCREEN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Android 文档:使用 FLAG_ACTIVITY_NEW_TASK 时,如果您正在启动的 Activity 的任务已经在运行,则不会启动新的 Activity;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。

所以在大多数情况下一切正常。

当用户点击某物时,该屏幕活动将调用finish()。此外,此屏幕活动将通过来自服务的传入事件启动或创建。

6053 I/ScreenActivity(15395): onCreate
6682 E/ScreenActivity(15395): finish() Activity
6832 I/ScreenActivity(15395): onDestroy

7284 I/ScreenActivity(15395): onCreate
7911 E/ScreenActivity(15395): finish() Activity
8063 I/ScreenActivity(15395): onDestroy

10555 I/ScreenActivity(15395): onCreate
13413 E/ScreenActivity(15395): finish() Activity
13701 I/ScreenActivity(15395): onCreate
13799 I/ScreenActivity(15395): onDestroy

最后一个是问题。 ScreenActivity 被创建,然后调用 finish() 本身。但问题是 onDestroy 被调用得很晚。在此之前有来自服务器的传入事件并调用 startActivity() 会触发一个新的 ScreenAcitivty onCreate()。问题是 ScreenManager 类为创建和销毁的活动保留标志。

该标志在 onCreate() 回调和 onDestroy() 回调时设置。 所以对于第 10555 和 13701 行,ScreenManager 设置 createFlag = true。对于第 13799 行,设置 createFlag = false。 在第 13799 行之后发生的事件将假定未创建活动并且未将事件通知给活动。

希望我对这个问题的描述对您来说很清楚。 这种场景 onStop() 和 onDestroy() 在调用 finish() 之后调用这么晚吗?如果是,我必须考虑解决方案。 如果没有,那有什么地方可以修改吗?

非常感谢。

【问题讨论】:

    标签: android android-lifecycle


    【解决方案1】:

    onDestroy() 可能会或可能不会被调用。你不能依赖它一直被调用。来自docs

    注意:不要指望调用此方法作为保存位置 数据! 例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle),不在这里。这种方法通常 实现释放资源,如与 活动,以便被破坏的活动不会留下这样的东西 在其应用程序的其余部分仍在运行时。 有 系统将简单地终止活动托管的情况 处理而不在其中调用此方法(或任何其他方法),因此它 不应该被用来做打算留在身边的事情 进程结束后。

    如果您需要知道您的Activity 是否正在完成,一个可靠的方法来知道它是否正在完成是isFinishing() 方法。您可以在onPause() 中调用它,以了解此暂停是否最终会导致此Activity 被销毁:

    @Override
    protected void onPause() {
        super.onPause();
        if (isFinishing()) {
            // Here  you can be sure the Activity will be destroyed eventually
        }
    }
    

    【讨论】:

    • 值得一提的 onStop 也不保证。
    【解决方案2】:

    使用处理程序,

     new Handler().postDelayed(new Runnable() {
                @Override
                public void run() 
                  //enter code here for open an Activity
                }
            },300);
    

    之后,我们得到的日志应该是:

    onCreate
    onStop
    onDestroy
    onCreate 
    

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 2012-02-26
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2018-07-04
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多