从类Binder派生如果你的service是你自己应用的私有物,并且与客户端运行于同一个进程中(一般都这样),你应该通过从类Binder派生来创建你的接口并且从onBind()返回一它的实例.客户端接收这个Binder然后使用它来直接操作所实现的Binder甚至Service的公共接口.当你的service仅仅是一个后台工作并且仅服务于自己的应用时,这是最好的选择.唯一使你不能以这种方式创建你的接口的理由就是你的service被其它应用使使用或者是跨进程的.
使用一个Messenger如果你需要你的接口跨进程工作,你可以为service创建一个带有Messager的接口.在此方式下,service定义一个Handler来负责不同类型的Message对象.这个Handler是Messenger可以与客户端共享一个IBinder的基础,它允许客户端使用Message对象发送命令给servic.客户端可以定义一个自己的Messenger以使service可以回发消息.这是执行IPC的最简单的方法,因为Messenger把所有的请求都放在队列中依次送入一个线程中,所以你不必把你的service设计为线程安全的
使用AIDLAIDL(Android接口定义语言)执行把对象分解为操作系统能够理解并能跨进程封送的基本体以执行IPC的所有的工作.上面所讲的使用一个Messenger,实际上就是基于AIDL的.就像上面提到的,Messenger在一个线程中创建一个容纳所有客户端请求的队列,使用service一个时刻只接收一个请求.然而,如果你想要你的service同时处理多个请求,那么你可以直接使用AIDL.在此情况下,你的service必须是多线程安全的.要直接使用AIDL,你必须创建一个.aidl文件,它定义了程序的接口.AndroidSDK工具使用这个文件来生成一个实现接口和处理IPC的抽象类,之后你在你的service内派生它.
注:大多数应用不应使用AIDL来处理一个绑定的service,因为它可能要求有多线程能力并且导致实现变得更加复杂.同样的,AIDL也不适合于大多数应用并且本文档不会讨论如何在你的service中使用它.如果你确定你需要直接使用AIDL,请看AIDL的文档.
Service
public class MyService extends Service { Messenger messenger = null; Messenger replyMessenger = null; public MyService() { } @Override public void onCreate() { super.onCreate(); messenger = new Messenger(handler);//实例化一个对象,并将Handler传入绑定,UI MQ消息检测 } Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Log.d("","Msg:" + msg.what + ";" + msg.obj); replyMessenger = msg.replyTo; } }; @Override public IBinder onBind(Intent arg0) { return messenger.getBinder();//返回Binder接口 }}
Activity
private Messenger messenger;private Messenger sendMessenger; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { System.out.println("acitivty handler"); super.handleMessage(msg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(new Intent(this,MyService.class), conn, Context.BIND_AUTO_CREATE);//一样绑定一个Connection sendMessenger = new Messenger(handler); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName cn) { } @Override public void onServiceConnected(ComponentName cn, IBinder ibiner) { messenger = new Messenger(ibiner);//得到Service中的Messenger Log.d("","OK messenger connected........"); } }; public void sendMsg(int what, String msg){ //这个方法就是自己的业务信息发送消息 传递到Service中 有 Handler处理。 if (messenger == null) { return; } Message msg1 = Message.obtain(); msg1.what = what; msg1.obj = msg; msg.replyTo = sendMessenger; try { messenger.send(msg1); } catch (RemoteException e) { e.printStackTrace(); } }