场景如下:
- 开始 Activity A
- Activity A 启动服务 S
- 服务 S 在前台模式下运行并显示一个通知,当用户按下该通知时会将用户带到 Activity B(具有 launchMode="singleTop")
- Activity B 出现
- 按主页
- 进入 DDMS 并终止您的应用程序进程以模拟您的应用程序死亡(按红色停止按钮)
- Android 会说“在 5000 毫秒内重新安排崩溃的服务”(有时更长)
- 服务 S 重新启动并显示通知。
- 服务重启时按通知图标...
...此时,由于进程意外结束,Android 将同时恢复 Activity A 和 B。但是尽管 Activity B 是 singleTop android 会再次生成它,因为用户点击了通知。这导致 Activity 堆栈上有 A -> B -> B。按返回键将带您再次进入 Activity B 的第一个恢复实例。
Android 团队的某个人能否阐明幕后发生的事情以及如何避免这种情况?模拟 Android 由于内存不足而终止进程的最佳方法是什么?从 DDMS 按下 STOP 是否足够好或边缘情况,这在正常情况下永远不会发生?
设置 --> 应用程序中的“强制停止”与 DDMS 中的停止有什么区别?
提前致谢!
最佳答案
此行为不应根据进程是否被终止而改变。 Activity 管理器首先查看服务器端堆栈来决定要做什么,一旦适本地调整了堆栈,它就会恢复现在位于堆栈顶部的任何内容。
检查您的应用,确保它在重新初始化或执行其他类似操作时未调用 startActivity()。查看日志以查看正在启动的 Activity 以及正在使用的 Intent 。使用“adb shell dumpsys activity”查看当前 Activity 堆栈的样子。也许您已经清除了任务关联,所以第二个 Activity B 正在其自己的任务中启动(在这种情况下 singleTop 不会有影响)?
此外,如果您不包含有关您正在做的事情的有用细节,那么真的很难帮助别人。不同步骤的相关日志语句,“adb shell dumpsys activity”显示的activity堆栈状态等。
关于具有 singleTop 和前台服务的 Android 生命周期怪异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8336661/