活动如何从服务中获取值?

时间:2015-04-01 20:07:40

标签: android android-service

我有两个类:一个是活动,另一个是从NotificationListenerService派生的类。

我需要让活动能够获取设备中断过滤器设置的初始值,然后在其发生变化时收到通知。

因此,当中断过滤器的值发生变化时,活动正在监听NLS所做的广播。 但是,我需要获取中断过滤器的初始值 - 如果用户永远不会更改此值,那么我的活动将永远不会获得广播,因此它永远不会知道该值是什么。

所以我的问题是活动如何从服务中请求值?

请注意,NotificationListenerService是由操作系统启动的,它不是我的活动创建或启动的。

1 个答案:

答案 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自己的方法一样。