Android - onStop() 将被延迟调用

Posted

技术标签:

【中文标题】Android - onStop() 将被延迟调用【英文标题】:Android - onStop() will be called with a delay 【发布时间】:2016-06-06 06:56:14 【问题描述】:

我发现我的活动onStop() 方法将在不到 10 秒的延迟内被调用。我以前从未见过这种行为。

注意:-活动是singleTop,它以Intent.FLAG_ACTIVITY_REORDER_TO_FRONT标志开头。

注意:-我使用的是 Build Tools v23.0.2。

延迟不在之前,该方法将被立即调用。

【问题讨论】:

您能详细说明一下吗?哪个活动开始哪个?我猜这个问题至少有 2 项活动。 @TinTran 同意。请提供更具体的细节。 你调试你的代码了吗?请详细说明您的问题,使用 logcat 粘贴一些代码 sn-p。它将帮助我们了解确切的问题。 请给我们看一些代码 您需要在问题中提供更多详细信息,以便人们提供帮助。无论哪种方式,我都不会依赖在任何时间范围内调用 onStop,只依赖 onPause。您不应该依赖 onStop 调用的顺序与覆盖活动的 onStart 的正确性。 【参考方案1】:

我猜您正在启动另一个活动,并且您希望当前活动接收 onStop() 回调。根据activity lifecycle,onPause() 方法在 onStop() 之前调用。在某些情况下,onSaveInstance() 也会在 onStop() 方法之前调用。此外,当您调用 startActivity 或 startActivityForResult (再次,我假设这就是您希望调用 onStop 的原因)时,根据传递的参数,如果需要计算/获取/等这些参数,它可能在系统执行 startActivity 之前需要一段时间,这将是 android 最早启动生命周期调用的时间。在此处没有任何代码的情况下,在调用 onStop 之前无法查看正在执行的其他内容。我建议您检查代码执行时间的时间线,从 startActivity 开始,在调用 onStop 时,可能通过记录每个调用的时间戳,从 startActivity 调用之前的时间戳开始,以开始时的时间戳结束onStop,查看时间都花在了哪里。我还建议通过确保 startActivity 或 startActivityForResult 的所有参数之前都设置为它们的值来简化这一点,如果还没有的话。

【讨论】:

【参考方案2】:

您可以通过将 noHistory:true 添加到清单文件中的活动或以编程方式设置标志来解决此问题。我遇到了同样的问题,这为我解决了问题。

【讨论】:

【参考方案3】:

在我的例子中,当onStop() 被调用时我停止了视频播放器,但是onStop() 调用有10s 的延迟。

您可以使用 eventBus、RxBus 之类的东西在

中发布事件
Application.ActivityLifecycleCallbacks 

    //post event here.and check the activity's Name in my targetActivity which play my video.
    onActivityStarted()


【讨论】:

【参考方案4】:

我遇到了同样的问题。当我使用 startActivity() 启动一个活动时,onStop() 在 onPause() 之后 10 秒被调用。

在我的例子中,正在启动的活动有一个片段,它有一个 WebView。我不知道为什么,但如果我删除以下行,延迟只有 2 秒左右。

webView.setScrollbarFadingEnabled(false);

【讨论】:

【参考方案5】:

我刚遇到这个问题,调试后有一个案例是 AdView(Admob 横幅)导致这个问题。

在活动 A(放置一个广告视图)中,我开始活动 B。从 B 回到 A 并立即调用 B 的 onPause,但所有停止/销毁都需要 10 秒才能被调用。移除广告横幅,然后一切恢复正常。

只需在此处发布此案例以供任何人参考。

【讨论】:

【参考方案6】:

可能是模拟器今天很慢

但 onStop() 应该作为单个命令立即调用

在此之前没有调用 onPause() 或任何东西

【讨论】:

以上是关于Android - onStop() 将被延迟调用的主要内容,如果未能解决你的问题,请参考以下文章

Android:在活动中 onStart()、onStop()、onDestroy() 的开头或结尾调用 super()?

Android:恢复 singleTask 活动

防止新意图或切换应用程序破坏活动

在Android N多窗口模式下按下主页按钮时未调用Activity onStop()

面试题:android中A Activity 打开B Activity,为什么A Activity的onStop()方法最后被调用

OnStop() 多次将数据保存到数据库