service bound(二)
service bound(二)
service 绑定有三种实现方式:
1. 直接继承Binder类实现。
条件: 同一应用,同一进程
2. 使用Messenger实现。
条件:要在不同的进程间通信,这种方式不用考虑线程安全性。(单线程操作时使用)
3. 使用AIDL实现。
条件:要在不同的进程间通信,并且需要多线程处理。要考虑线程之间的安全性。
通过Messenger实现bound service。
实现步骤:
service 要实现Handler,service通过Handler可以得到客户端的调用请求。Handler用于创建Messenger对象。
Messenger创建一个IBinder,client调用onBind()时,IBinder返回给client的
Clients 通过IBinder实例化Messenger
service 通过Handler收到每一个Message, 在
handleMessage()
方法明确的处理.---service 要实现Handler,service通过Handler可以得到客户端的调用请求。
class MessengerHandler extends Handler{@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case REGISTER:if(msg.replyTo != null && !messengerList.contains(msg.replyTo)){messengerList.add(msg.replyTo) ;}Toast.makeText(getApplicationContext(), "bound", Toast.LENGTH_SHORT).show();break;case UNREGISTER:if(msg.replyTo != null && messengerList.contains(msg.replyTo)){messengerList.remove(msg.replyTo) ;}Toast.makeText(getApplicationContext(), "unbound", Toast.LENGTH_SHORT).show();break;case REPLYTO:Message message = Message.obtain(null, 1, 0, 0);Bundle data = new Bundle() ;data.putString("REPLYTO", "reply from service") ;message.setData(data) ;try {msg.replyTo.send(message) ;} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}default:super.handleMessage(msg);break;}}}
<activity android:name=".messenger.MessengerActivity"> <intent-filter> <action android:name="com.hualu.serviceexample.BIND_MESSENGER_ACTIVITY"></action> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter> </activity> <service android:name=".messenger.MessengerService"> <intent-filter> <action android:name="com.hualu.serviceexample.BIND_MESSENGER_SERVICE"></action> </intent-filter> </service>