我正在开发一个 Android 应用程序(如果您想了解更多信息 http://www.txty.mobi),我在对话框管理方面遇到了一些问题。我对 Android 很陌生,所以我做事的方式完全错误。如果是这种情况,请直说,并指出我要遵循的正确文档。
背景:
到目前为止,应用程序的主要 block 是一个 Activity 和一个服务(派生自 IntentService)。 actvity 需要在两种情况下与服务交互:启动/停止服务。 Intent 服务将使用 AlarmManager self 调节其生命周期。
点击开始/停止时的典型流程:
1) onResume 上的 Activity 将广播接收器注册到服务发送的事件(在 onPause 中取消注册)
2) Activity 启动一个不确定的进度对话框
3) Activity 发送单次警报事件(启动或停止),该事件将**直接发送到服务
4) 服务执行启动所需的操作
5) 服务发出广播事件,基本上说“完成”
6) Activity 收到此事件并摆脱对话框。
问题:
Activity 可能会失去其前台状态比方说,如果用户切换焦点或接到电话,则调用 onPause 方法(此时 Activity 可能甚至被系统杀死以索取内存)。显然,如果是这种情况, Activity 将永远不会收到其广播事件,因为接收器已注销。这将使应用程序处于尴尬的境地,当 Activity 再次被带到前面时,会有一个您无法终止也永远不会摆脱的对话框。
(可能的??)解决方案:
我现在处理这个问题的方法(除了保持广播接收器就位)是创建一个实用程序类,它使用首选项来跟踪正在执行的操作及其状态:
Activity
- 在 onResume 中使用我的实用程序类获取 Activity 正在等待的操作列表
- 检查他们的状态
- 如果它们完成,则相应地执行一些操作(在我的例子中,去掉对话框!)
- 从首选项中删除操作。
- 在请求对服务进行操作之前,它使用我的实用程序类将其保存到首选项。
服务
使用我的实用程序类执行操作并将操作状态保存到首选项。
发出广播。
灾难发生!
现在这在正常情况下救了我,但如果发生灾难(即使用任务 killer 应用程序你杀死一切)服务可能会在它可以保存操作状态之前被杀死我像以前一样卡住( Activity 会认为操作仍在进行,因此不会触及对话框)。所以现在我添加了一个 Dismiss 按钮以防万一:)
现在所有这些看起来都太复杂了,我认为这应该是一件相当普遍的事情。这就是为什么,正如帖子开头所说,我可能(很可能!)完全错了。
有任何想法吗?抱歉,如果已经有人问过这个问题,我环顾四周但没有找到任何东西。请指出任何解释这一点的在线资源。
感谢并抱歉发了这么长的帖子 :P
卢卡
最佳答案
您是否尝试过使用 StickyBroadcast ?这会缓存最新的广播,因此可以在 onResume
上接收它。请看this post .
关于java - 安卓对话框管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659468/