My Activity(称为A)启动IntentService(称为IS)作为更大任务(称为T)中的一个步骤。IS可能运行一个小时或更长时间;当它完成时,它必须以某种方式告诉A,这样A就可以在任务T中采取下一步行动。但是,当IS完成时,用户可能已经做了很多事情,包括完全杀死A。然而,当用户重新启动它时,A必须意识到IS已经完成,这样A才能在任务T中采取下一步行动。
关于如何从IS到A进行通信,有很多建议:Intent、PendingIntent、Broadcast-and-Receiver、ResultReceiver、Messenger线程等。[我没有提供链接,因为简单的搜索就会显示它们。]但所有人都认为A在发送消息时还活着。IS似乎根本无法向一个死去的a.发送信息
还是可以?
SharedPreferences可能是将消息从IS持久化到a的方法。完成后,IS在SharedPreferences中设置标志F。现在F是持久的,即使当设置F时A已经死了。当用户重新启动A时,它会检查F。如果设置了F,A知道is已经完成,现在A可以在任务T中采取下一步行动。
此外,如果A有一个SharedPreferences监听器,那么IS可以向A发出A是死是活的信号;IS根本不需要其他通信手段。
事实上,只要消息只是偶尔和短暂的,SharedPreferences Listeners似乎是沟通和协调的最佳方式。
这有道理吗?SharedPreferences不是为消息传递而设计的,所以我担心会有一些隐藏的后果。你觉得怎么样?
似乎IS根本无法向死a发送消息。
正确。您可以使用事件总线发布A可以拾取的事件,如果A没有拾取,您可以保留详细信息以供A稍后查找。
我在以下示例应用程序中演示了基本的事件总线"UI或回退"模式:
- greenrobot的EventBus 2.x
LocalBroadcastManager
- Square的Otto
在我的情况下,回退行为是引发Notification
,但这不是必需的。
SharedPreferences不是为消息传递而设计的,所以我担心会带来一些隐藏的后果
一个是性能。SharedPreferences
总是执行磁盘I/O。在没有运行的a实例的情况下,将其用作回退是可以的。一直使用它并不理想。
还要注意,在这里使用SharedPreferences
并没有什么神奇之处。任何形式的持久性都可以工作(例如,数据库、其他类型的文件)。特别是如果可能有几个来自IS的消息需要排队,我会考虑使用磁带。