服务与 Activity 之间的通信各自托管在使用 PendingIntent 的不同进程中

Communication between Service and Activity each hosted in different process using PendingIntent

我正在从调用 startService() 后被销毁的片段启动前台服务,这是我无法使用 ResultReceiverMessanger 的原因。所以选项仍然是PendingIntent。我如何使用 PendingIntent 在来自任何 activity/fragment 的前台服务(托管在不同进程中)之间进行通信?

您有两个不同的问题:

  1. 如何从服务进程获取数据到UI进程?

  2. 你如何从你为 #1 所做的任何事情中获取数据到 UI 需要该数据的任何部分?

#1 有多种解决方案:PendingIntentResultReceiverMessenger、AIDL 定义的绑定服务连接回调等。#2 则主要是使用事件总线或类似的东西来提醒所有相关的 Java 对象关于新数据的问题。

因此,例如,这里有一个使用 PendingIntent 的即兴食谱:

  1. 在您的 activity 进程中实施 BroadcastReceiverService,已在清单中注册,但没有 <intent-filter>

  2. 作为调用 startService() 的一部分,使用其 getBroadcast()getService() 工厂方法创建一个 PendingIntent,并使用 Intent标识您的 BroadcastReceiverService,并将 PendingIntent 放在与 startService()

  3. 一起使用的 Intent 的额外位置
  4. 您在另一个进程中的服务,当它有数据要传递给 activity 进程时,calls send() on the PendingIntent,包括一个 Intent 和要填充的数据广播或服务请求

  5. 您的 BroadcastReceiverService 来自步骤 #1 的 Intent 交付给它并使用事件总线让您的其余部分 activity 进程知道发生了什么,还处理 activity 进程中的 为事件注册的情况(例如,如果所有活动都引发 Notification被摧毁)