现在,Activity可以使用以下三种方式之一连接到服务:
我认为BroadcastReceivers是最简单的沟通方式,但我想知道为什么以及何时使用其他方式?或者换言之,使用信使或AIDL的最佳做法是广播接收者?
答案 0 :(得分:12)
我主要倾向于使用LocalBroadcasts
。它们基本上就像真正的广播一样,但只对您的应用程序可见。首先,您必须像普通广播一样创建BroadcastReceiver
:
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(Intent.SOME_ACTION.equals(action)) {
// Do your work
}
}
};
然后您可以注册和取消注册BroadcastReceiver
,如下所示:
@Override
public void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(Intent.SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.unregisterReceiver(broadcastReceiver);
}
最后,您可以从Service
或您应用中的任何其他位置发送广播,如下所示:
Intent intent = new Intent(Intent.SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);
答案 1 :(得分:10)
如果您希望在应用中BroadcastReceiver
和Service
之间进行通信,可以使用Activity
。
Messenger
和AIDL
。在这种情况下,您的界面应该有一个Service
,它定义了Handler
,可以响应不同类型的Message
个对象。
现在Messenger
和AIDL
之间的差异非常简单。使用Messenger
时,它会将所有请求排入单个线程。所以你的Service
不一定是线程安全的。如果您希望Service
同时处理多个请求,则可以直接使用AIDL
。在这种情况下,您的Service
必须能够进行多线程并且构建为线程安全的。事实上,Messenger
是在AIDL
的顶部实现的。
为了更好地理解,请查看Bound Services
的答案答案 2 :(得分:3)
Xaver Kapeller 的回答确实很好。但是,它有(主要)缺点:广播可能会被遗漏。
当用户离开Activity
时(例如,通过显示最近的应用),您取消注册BroadcastReceiver
。如果此时发送广播,则您的Activity
不会收到广播。导航回Activity
时,它可能处于无效状态。
使用ResultReceiver
,在这种情况下仍会收到结果。此外,ResultReceiver
为parcelable
,因此您可以在生命周期事件中保存和恢复它
它会导致一些开销,这就是为什么我创建this experimental library来缓解它的原因。现在它只使用IntentService
,但它应该很容易扩展。
答案 3 :(得分:2)
如果您的service is used only by the local application
并且不需要跨流程工作,则可以实施自己的Binder class
,以便客户直接访问public methods in the service
。
注意:仅当客户端和服务位于同一应用程序和进程中时才有效。这是最常见的。
扩展Binder类 http://developer.android.com/guide/components/bound-services.html#Binder