服务与 Activity 之间的通信各自托管在使用 PendingIntent 的不同进程中
Communication between Service and Activity each hosted in different process using PendingIntent
我正在从调用 startService()
后被销毁的片段启动前台服务,这是我无法使用 ResultReceiver
或 Messanger
的原因。所以选项仍然是PendingIntent
。我如何使用 PendingIntent 在来自任何 activity/fragment 的前台服务(托管在不同进程中)之间进行通信?
您有两个不同的问题:
如何从服务进程获取数据到UI进程?
你如何从你为 #1 所做的任何事情中获取数据到 UI 需要该数据的任何部分?
#1 有多种解决方案:PendingIntent
、ResultReceiver
、Messenger
、AIDL 定义的绑定服务连接回调等。#2 则主要是使用事件总线或类似的东西来提醒所有相关的 Java 对象关于新数据的问题。
因此,例如,这里有一个使用 PendingIntent
的即兴食谱:
在您的 activity 进程中实施 BroadcastReceiver
或 Service
,已在清单中注册,但没有 <intent-filter>
作为调用 startService()
的一部分,使用其 getBroadcast()
或 getService()
工厂方法创建一个 PendingIntent
,并使用 Intent
标识您的 BroadcastReceiver
或 Service
,并将 PendingIntent
放在与 startService()
一起使用的 Intent
的额外位置
您在另一个进程中的服务,当它有数据要传递给 activity 进程时,calls send()
on the PendingIntent
,包括一个 Intent
和要填充的数据广播或服务请求
您的 BroadcastReceiver
或 Service
来自步骤 #1 的 Intent
交付给它并使用事件总线让您的其余部分 activity 进程知道发生了什么,还处理 activity 进程中的 无 为事件注册的情况(例如,如果所有活动都引发 Notification
被摧毁)
我正在从调用 startService()
后被销毁的片段启动前台服务,这是我无法使用 ResultReceiver
或 Messanger
的原因。所以选项仍然是PendingIntent
。我如何使用 PendingIntent 在来自任何 activity/fragment 的前台服务(托管在不同进程中)之间进行通信?
您有两个不同的问题:
如何从服务进程获取数据到UI进程?
你如何从你为 #1 所做的任何事情中获取数据到 UI 需要该数据的任何部分?
#1 有多种解决方案:PendingIntent
、ResultReceiver
、Messenger
、AIDL 定义的绑定服务连接回调等。#2 则主要是使用事件总线或类似的东西来提醒所有相关的 Java 对象关于新数据的问题。
因此,例如,这里有一个使用 PendingIntent
的即兴食谱:
在您的 activity 进程中实施
BroadcastReceiver
或Service
,已在清单中注册,但没有<intent-filter>
作为调用
startService()
的一部分,使用其getBroadcast()
或getService()
工厂方法创建一个PendingIntent
,并使用Intent
标识您的BroadcastReceiver
或Service
,并将PendingIntent
放在与startService()
一起使用的 您在另一个进程中的服务,当它有数据要传递给 activity 进程时,calls
send()
on thePendingIntent
,包括一个Intent
和要填充的数据广播或服务请求您的
BroadcastReceiver
或Service
来自步骤 #1 的Intent
交付给它并使用事件总线让您的其余部分 activity 进程知道发生了什么,还处理 activity 进程中的 无 为事件注册的情况(例如,如果所有活动都引发Notification
被摧毁)
Intent
的额外位置