使用singleTop和前台服务的Android生命周期怪异?

时间:2011-12-01 04:47:27

标签: android service android-activity lifecycle

以下是该方案:

  • 开始活动A
  • 活动A启动服务S
  • 服务S以前台模式运行并显示一个通知,按下时将用户带到活动B(具有launchMode =“singleTop”)
  • 活动B显示
  • 按HOME
  • 进入DDMS并终止您的应用程序进程以模拟您的应用程序已死(按下红色STOP按钮)
  • Android会说“在5000毫秒内重新安排崩溃的服务”(有时更长)
  • 服务S重新启动并显示通知。
  • 服务重新启动时按通知图标...

...此时,Android将恢复活动A和B,因为该过程意外结束。但是,尽管活动B是singleTop,因为用户点击了通知,因此android会将其生成AGAIN。这导致具有A - >; B - > B在活动堆栈上。按下后将再次转到第一个恢复的活动B实例。

Android团队成员是否可以澄清幕后发生的事情以及如何避免这种情况?模拟Android因内存不足而杀死进程的最佳方法是什么?从DDMS按STOP是否足够好还是边缘情况,这在正常情况下永远不会发生?

来自设置的'强制停止'有什么区别 - >应用程序与DDMS停止?

提前致谢!

3 个答案:

答案 0 :(得分:4)

此行为不应根据进程是否被终止而更改。活动管理器首先查看服务器端堆栈以决定要做什么,一旦堆栈被适当调整,它将恢复堆栈顶部的任何内容。

检查您的应用以确保在重新初始化或执行其他类似操作时不会调用startActivity()。查看日志以查看正在启动的活动和正在使用的意图。使用“adb shell dumpsys activity”查看当前活动堆栈的外观。也许你已经清除了任务亲和力,所以第二个活动B正在自己的任务中启动(在这种情况下,singleTop会没有影响)?

如果您不包含有关您正在做的事情的有用详细信息,那么帮助别人真的很难。不同步骤的相关日志语句,“adb shell dumpsys activity”显示的活动堆栈状态等。

答案 1 :(得分:2)

我不太确定DDMS中的STOP和强制停止之间的详细差异,但我很确定DDMS会绕过Force Stop会执行的一些内部Android功能,因为我不记得Android曾经重新初始化我的活动强制停止。如果这是真的,那么我怀疑你所看到的是由Android启动的两个不同任务的结果:一个用于旧的,被杀死的活动,另一个用于被杀死的服务重新启动时。你可以通过将标志设置为" singleTask"来测试这个理论。并检查是否发生相同的行为。希望这会有所帮助。

答案 2 :(得分:0)

有A - > B - >即使B是singleTop,B也是可能的:对于B作为其他任务启动的情况。在实际上有2个堆栈的情况下:A - > B和B