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 N多窗口模式下按下主页按钮时未调用Activity onStop()
面试题:android中A Activity 打开B Activity,为什么A Activity的onStop()方法最后被调用