如何从 IntentService 与当时可能不是 运行 的 Activity 进行通信?
How to communicate from an IntentService to an Activity that may not be running at the time?
我的 Activity(称为 A)启动 IntentService(称为 IS)作为更大任务(称为 T)的一个步骤。 IS 可能 运行 一个小时或更长时间;当它完成时,它必须以某种方式告诉 A,以便 A 可以执行任务 T 的下一步。但是,当 IS 完成时,用户可能已经做了很多事情,包括完全杀死 A。然而,当用户重启它时,A 必须意识到 IS 已经完成,这样 A 才能在任务 T 中进行下一步。
有很多建议如何从 IS 到 A 进行通信:Intent、PendingIntent、Broadcast 和 Receiver、ResultReceiver、Messenger thread 等。[我没有提供链接,因为简单的搜索会显示它们。]但是所有假设在发送消息时 A 还活着。看来IS根本无法向死去的A发送消息。
或者可以吗?
SharedPreferences 可能是将消息从 IS 保存到 A 的方式。完成后,IS 在 SharedPreferences 中设置标志 F。现在 F 是持久的,即使在设置 F 时 A 已经死了。当用户重新启动 A 时,它会检查 F。如果 F 已设置,则 A 知道 IS 已完成,现在 A 可以执行任务 T 的下一步。
此外,如果A有一个SharedPreferences Listener,那么IS可以向A发出A是死是活的信号; IS 根本不需要其他通信方式。
事实上,SharedPreferences Listeners 似乎通常是沟通和协调的最佳方式,只要消息只是偶尔且简短。
这有意义吗? SharedPreferences 不是为消息传递而设计的,所以我担心一些隐藏的后果。你怎么看?
It seems IS simply cannot send a message to a dead A.
正确。您可以使用事件总线来 post A 可以拾取的事件,如果 A 没有拾取它,您可以保留详细信息供 A 稍后查找。
我在这些示例应用程序中演示了基本事件总线 "UI or fallback" 模式:
在我的例子中,后备行为是引发 Notification
,但这不是必需的。
SharedPreferences was not designed for messaging, so I fear some hidden consequences
一个是性能。 SharedPreferences
始终执行磁盘 I/O。对于没有 A 的 运行 实例的情况,使用它作为后备是可以的。一直用它并不理想。
另请注意,此处使用 SharedPreferences
并没有什么神奇之处。任何形式的持久性都可以工作(例如,数据库,其他类型的文件)。特别是如果可能有几条来自 IS 的消息需要排队,我会考虑使用 Tape.
我的 Activity(称为 A)启动 IntentService(称为 IS)作为更大任务(称为 T)的一个步骤。 IS 可能 运行 一个小时或更长时间;当它完成时,它必须以某种方式告诉 A,以便 A 可以执行任务 T 的下一步。但是,当 IS 完成时,用户可能已经做了很多事情,包括完全杀死 A。然而,当用户重启它时,A 必须意识到 IS 已经完成,这样 A 才能在任务 T 中进行下一步。
有很多建议如何从 IS 到 A 进行通信:Intent、PendingIntent、Broadcast 和 Receiver、ResultReceiver、Messenger thread 等。[我没有提供链接,因为简单的搜索会显示它们。]但是所有假设在发送消息时 A 还活着。看来IS根本无法向死去的A发送消息。
或者可以吗?
SharedPreferences 可能是将消息从 IS 保存到 A 的方式。完成后,IS 在 SharedPreferences 中设置标志 F。现在 F 是持久的,即使在设置 F 时 A 已经死了。当用户重新启动 A 时,它会检查 F。如果 F 已设置,则 A 知道 IS 已完成,现在 A 可以执行任务 T 的下一步。
此外,如果A有一个SharedPreferences Listener,那么IS可以向A发出A是死是活的信号; IS 根本不需要其他通信方式。
事实上,SharedPreferences Listeners 似乎通常是沟通和协调的最佳方式,只要消息只是偶尔且简短。
这有意义吗? SharedPreferences 不是为消息传递而设计的,所以我担心一些隐藏的后果。你怎么看?
It seems IS simply cannot send a message to a dead A.
正确。您可以使用事件总线来 post A 可以拾取的事件,如果 A 没有拾取它,您可以保留详细信息供 A 稍后查找。
我在这些示例应用程序中演示了基本事件总线 "UI or fallback" 模式:
在我的例子中,后备行为是引发 Notification
,但这不是必需的。
SharedPreferences was not designed for messaging, so I fear some hidden consequences
一个是性能。 SharedPreferences
始终执行磁盘 I/O。对于没有 A 的 运行 实例的情况,使用它作为后备是可以的。一直用它并不理想。
另请注意,此处使用 SharedPreferences
并没有什么神奇之处。任何形式的持久性都可以工作(例如,数据库,其他类型的文件)。特别是如果可能有几条来自 IS 的消息需要排队,我会考虑使用 Tape.