在活动和服务中注册接收者都有缺点吗?

时间:2018-10-08 13:30:33

标签: android broadcastreceiver android-service localbroadcastmanager

这种情况是这样的:我有一项活动和一项服务。两者之间需要发送一些信息:

  • 活动可以查询服务以查看其运行情况
  • 活动可以向服务查询变量值
  • 活动可以要求服务执行操作(运行其方法)

  • 服务可以发送对活动进行中的响应

  • 该服务可以在活动调用时回复活动

由于这看起来更像是一种双向交流,因此我正在考虑使用LocalBroadcastManager并具有以下特征:

public class MyActivity extents Activity{

   private void receiver = new BroadcastReceiver(){
      onReceive(){
        //Handle Message from Service
      }
  }

  onResume -> LocalBroadcastManager.registerReceiver(receiver);
  onPause  -> LocalBroadcastManager.unregisterReceiver(); 
} 

和服务

public class MyService extents Service{

   private void receiver = new BroadcastReceiver(){
      onReceive(){
        //Handle Message from Activity
      }
  }

  onStart-> LocalBroadcastManager.registerReceiver(receiver);
  onDestroy-> LocalBroadcastManager.unregisterReceiver(); 
} 

这将避免应用程序组件之间的绑定或其他通信方式,但同时允许发送意图和侦听观察者。这种方法有什么缺点吗?

2 个答案:

答案 0 :(得分:0)

不应该。

这是Android应用程序中跨组件通信的推荐方式。您正在使用Google本地广播而不是全球广播来完全按照Google的建议进行操作。

在评论中,您提到绑定服务通常是Activity-> Service通信的方式。在大多数情况下,您无需使用此功能。绑定服务有点烦人,因为它不是即时的,您需要使用侦听器来存储对Binder的引用。相比之下,广播相对简单。

答案 1 :(得分:0)

看起来您的活动应该仅绑定到服务以获得一个Binder实例,您可以使用该实例访问服务方法。该服务可以发送活动可以通过广播接收器观察到的本地广播。我最近的偏好是让服务方法返回可以观察到的LiveData实例。 LiveData对象是生命周期感知的,因此任何观察者都将知道自己进行清理。