我有两个类:一个是活动,另一个是从NotificationListenerService派生的类。
我需要让活动能够获取设备中断过滤器设置的初始值,然后在其发生变化时收到通知。
因此,当中断过滤器的值发生变化时,活动正在监听NLS所做的广播。 但是,我需要获取中断过滤器的初始值 - 如果用户永远不会更改此值,那么我的活动将永远不会获得广播,因此它永远不会知道该值是什么。
所以我的问题是活动如何从服务中请求值?
请注意,NotificationListenerService是由操作系统启动的,它不是我的活动创建或启动的。
答案 0 :(得分:0)
您可以使用SharedPreferences存储一些值(在服务中),并且您的活动可以通过从SharedPreferences加载值来依赖于它。
您也可以使用EventBus并使用它传递一些事件。方式应该是这样的:
- 您的活动注册EventBus用于捕获一些特殊事件而不是NLS。
- 通知服务在需要时生成并发布事件。它还会将您的活动所需的任何数据打包到事件中
- 您的活动从NS捕获新事件并从中获取数据:
public void onEvent(final FriendsRenameEvent event) {
Log.i(this, "onEvent() FriendsRenameEvent event");
if (event.isActionSucced)
listAdapter.notifyDataSetChanged();
}
该事件只是一个simeple类(extends Object):
public class FriendsRenameEvent {
public final boolean isActionSucced;
public FriendsRenameEvent(final boolean isSucced/*, final Contact rejectedContact*/) {
this.isActionSucced = isSucced;
}
}
我将它用于GCM(GCMIntenService的一部分):
private void handleMessage(final Bundle gcmBundle) {
if (gcmBundle == null) {
Log.e(this, "handleMessage(): Received null-gcmBundle in GCMIntentService.onReceive()!");
return;
}
Log.i(this, "handleMessage(): gcmBundle: " + gcmBundle);
EventBus.getDefault().post(new IncomingGCMEvent(gcmBundle));
}
在活动中:
public void onEventMainThread(final IncomingGCMEvent event) {
final String payloadMessage = event.gcmBundle.getString("collapse_key");
...
}
还有一种将服务和活动绑定在一起的绑定机制。使用Bind接口,您可以从Activity中运行Sevice的方法,就像Activity自己的方法一样。