具有 singleTop 和前台服务的 Android 生命周期怪异?

标签 android service android-activity lifecycle

场景如下:

  • 开始 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/

相关文章:

android - TextView 中的项目符号点被截断

java - 从 Google App Engine 调用 Firebase 数据库

csv - 从 go-kit golang 中的 API 请求解析 CSV 文件

Activity 类之外的 Android 上下文

已创建 Android 跟踪文件但长度为零字节

android - 使用 Ant 构建 Android 库项目

android - 更新服务中的 MusicPlayer SeekBar

service - ZF2 通过附加参数从服务管理器获取服务

android - 具有透明背景的 PreferenceFragment?

android - 如何为简单的 mp3 播放器设计 Activity 服务交互?