Messenger:两个进程通过Messenger传递消息,进程1和进程2中都需要创建一个Messenger,创建过程:首先进程2需要创建一个服务,
并在服务中创建一个Messenger对象,进程1通过绑定进程2的服务,在绑定服务时进程2通过Messenger返回一个IBinder对象,
进程1通过绑定服务后返回的IBinder对象,创建一个进程1的Messenger对象这样就和进程2建立联系,就可以通过Messenger进行消息传递
服务端:
1、在服务中创建一个Messenger,用于向客户端发送消息;
2、服务端服务在被绑定时通过Messenger获取IBinder对象并返回,这时就和客户端建立了联系。
3、客户端发送消息后,在服务端的Handler回调中的,可通过msg.reply方法获取客户端传递过来的messenger,
然后创建messge,加入messenger中,并由messenger传递给客户端
客户端:
1、首先绑定服务端的服务,服务端通过创建Messenger,从Messenger中获取客户端需要的IBinder对象并返回,
客户端根据服务端返回的IBinder对象,创建客户端的Messenger对象,通过Messenger和服务端建立联系,并进行消息传递;
2、客户端创建一个Message,由Messenger携带并传入服务端
示例代码如下:
首先是服务端代码:
1 package com.jiao.myaidl; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.os.Handler; 7 import android.os.IBinder; 8 import android.os.Message; 9 import android.os.Messenger; 10 import android.os.RemoteException; 11 12 13 public class MessengerService extends Service { 14 public MessengerService() { 15 } 16 17 //创建Messenger对象 18 private final Messenger mMessenger = new Messenger(new ServiceHandler()); 19 20 //消息回调,处理客户端传递过来的message对象 21 private class ServiceHandler extends Handler { 22 23 @Override 24 public void handleMessage(Message msg) { 25 super.handleMessage(msg); 26 27 switch (msg.what) { 28 case 0: 29 30 System.out.println("客户端发过来的:" + msg.getData().getString("client")); 31 Messenger clientMessenger = msg.replyTo;//获取客户端传过来的Messenger对象 32 Message replyMessage = Message.obtain();//创建一个返回的message对象 33 replyMessage.what = 1; 34 Bundle bundle = new Bundle(); 35 bundle.putString("server_reply", "i come from server"); 36 replyMessage.setData(bundle); 37 38 try { 39 //通过客户端传过来的Messenger 将返回数据带回去 40 clientMessenger.send(replyMessage); 41 } catch (RemoteException e) { 42 e.printStackTrace(); 43 } 44 break; 45 } 46 } 47 } 48 49 ; 50 51 52 @Override 53 public IBinder onBind(Intent intent) { 54 //通过Messenger获取IBinder对象并返回 55 return mMessenger.getBinder(); 56 } 57 58 }
在清单文件中注册服务:
1 <service android:name="com.jiao.myaidl.MessengerService"> 2 <intent-filter> 3 <action android:name="com.jiao.myaidl.action.MESSENGER_SERVICE" /> 4 <category android:name="android.intent.category.DEFAULT" /> 5 </intent-filter> 6 </service>
客户端代码:
1 package com.jiao.myaidl; 2 3 import android.content.ComponentName; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.content.ServiceConnection; 7 import android.os.Bundle; 8 import android.os.Handler; 9 import android.os.IBinder; 10 import android.os.Message; 11 import android.os.Messenger; 12 import android.os.RemoteException; 13 import android.support.v7.app.AppCompatActivity; 14 import android.view.View; 15 import android.widget.Button; 16 17 import com.jiao.myaidl.client.R; 18 19 20 public class MessengerActivity extends AppCompatActivity { 21 22 private Messenger mMessenger; 23 24 private class clientHandler extends Handler { 25 26 @Override 27 public void handleMessage(Message msg) { 28 super.handleMessage(msg); 29 switch (msg.what) { 30 31 case 1: 32 String server_reply = msg.getData().getString("server_reply"); 33 System.out.println("服务器返回:" + server_reply); 34 break; 35 } 36 } 37 } 38 39 private ServiceConnection mConnection = new ServiceConnection() { 40 @Override 41 public void onServiceConnected(ComponentName name, IBinder service) { 42 mMessenger = new Messenger(service); 43 System.out.println("绑定服务成功"); 44 } 45 46 @Override 47 public void onServiceDisconnected(ComponentName name) { 48 49 bindService(); 50 } 51 }; 52 53 @Override 54 protected void onCreate(Bundle savedInstanceState) { 55 super.onCreate(savedInstanceState); 56 setContentView(R.layout.activity_messenger); 57 58 59 bindService(); 60 61 Button bt = (Button) findViewById(R.id.bt_messenger); 62 bt.setOnClickListener(new View.OnClickListener() { 63 @Override 64 public void onClick(View v) { 65 sendToService(); 66 } 67 }); 68 } 69 70 71 private void bindService() { 72 73 Intent it = new Intent(); 74 it.setAction("com.jiao.myaidl.action.MESSENGER_SERVICE"); 75 it.setPackage("com.jiao.myaidl.server"); 76 bindService(it, mConnection, Context.BIND_AUTO_CREATE); 77 } 78 79 80 private void sendToService() { 81 Message messageClient = Message.obtain(null, 0); 82 //用于传递给服务端回复的Messenger 83 Messenger replyMessenger = new Messenger(new clientHandler()); 84 Bundle bundle = new Bundle(); 85 bundle.putString("client", "i come from client"); 86 messageClient.setData(bundle); 87 //通过Message的replyTo属性将Messenger对象传递到服务端 88 messageClient.replyTo = replyMessenger; 89 try { 90 mMessenger.send(messageClient); 91 } catch (RemoteException e) { 92 e.printStackTrace(); 93 } 94 } 95 96 97 }
以上就是两个进程之间通过Messenger实现消息通信;