2015-04-01 70 views
0

我有两个类:一个是活动,另一个是从NotificationListenerService派生的类。活动如何从服务中获取价值?

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

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

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

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

回答

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类(扩展对象):

public class FriendsRenameEvent { 

    public final boolean isActionSucced; 

    public FriendsRenameEvent(final boolean isSucced/*, final Contact rejectedContact*/) { 
     this.isActionSucced = isSucced; 
    } 
} 
使用它的这样的(一个GCMIntenService的一部分)GCM

林:

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的自己的方法一样从一个Activity中运行一个Sevice的方法。

+0

通过广播发布内容的服务如何与通过事件发布内容不同?我的意思是它仍然是一个推动设计,但我需要拉动活动。或者事件总线可以提供拉式功能?感谢关于SharedPreferences的建议,这可能是一个简单的解决方案。 – Gruntcakes 2015-04-01 20:26:27

+0

NotificationListenerService可以预先设置一个事件,并且您的Activity捕获该事件。不需要拉动。你可以在事件中包含任何你想要的东西。所以当Activity收到事件时,它可以从中“拉出”所需的数据。你有没有尝试过EventBus?如果不尝试,我会链接它的GitHub – Stan 2015-04-01 20:32:48

+0

NLS看起来很特别 - 只有操作系统可以绑定它。并且NLS在活动创建之前由操作系统启动,因此活动没有机会设置监听等,以及时捕获服务的初始输出(否则服务可以通过广播或一个事件等onListenerConnected,但这太早,它会被活动所错过)。 – Gruntcakes 2015-04-01 20:37:57