在 activity 和服务中注册接收者的缺点?
Drawbacks in registering receivers in both the activity and service?
场景是这样的:我有一个activity和一个服务。两者之间需要发送一些东西:
- activity可以查询服务看是否运行ning
- activity可以查询变量值的服务
activity可以请求服务执行操作(运行它的一个方法)
服务可以发送对 activity 操作的响应
- 服务可以在 activity 调用
时响应 activity
因为这看起来更像是一种双向通信,我正在考虑使用 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();
}
这将允许避免应用程序组件之间的绑定或其他通信方法,但同时允许发送意图和监听观察者。这种方法有什么缺点吗?
不应该。
这是 Android 应用程序中推荐的跨组件通信方式。您正在按照 Google 的建议进行操作,使用本地广播而不是全球广播。
在评论中,您提到绑定服务通常是为了Activity->服务通信。在大多数情况下您不需要使用它。绑定服务有点烦人,因为它不是即时的,您需要使用侦听器来存储对 Binder 的引用。相比之下,广播就相对简单了。
看起来您的 activity 应该只绑定到服务以获取可用于访问服务方法的 Binder 实例。该服务可以发送 Activity 可以使用广播接收器观察到的本地广播。我最近的偏好是使用可以观察到的服务方法 return LiveData 实例。 LiveData 对象是生命周期感知的,所以任何观察者都会知道自己清理。
场景是这样的:我有一个activity和一个服务。两者之间需要发送一些东西:
- activity可以查询服务看是否运行ning
- activity可以查询变量值的服务
activity可以请求服务执行操作(运行它的一个方法)
服务可以发送对 activity 操作的响应
- 服务可以在 activity 调用 时响应 activity
因为这看起来更像是一种双向通信,我正在考虑使用 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();
}
这将允许避免应用程序组件之间的绑定或其他通信方法,但同时允许发送意图和监听观察者。这种方法有什么缺点吗?
不应该。
这是 Android 应用程序中推荐的跨组件通信方式。您正在按照 Google 的建议进行操作,使用本地广播而不是全球广播。
在评论中,您提到绑定服务通常是为了Activity->服务通信。在大多数情况下您不需要使用它。绑定服务有点烦人,因为它不是即时的,您需要使用侦听器来存储对 Binder 的引用。相比之下,广播就相对简单了。
看起来您的 activity 应该只绑定到服务以获取可用于访问服务方法的 Binder 实例。该服务可以发送 Activity 可以使用广播接收器观察到的本地广播。我最近的偏好是使用可以观察到的服务方法 return LiveData 实例。 LiveData 对象是生命周期感知的,所以任何观察者都会知道自己清理。