IPC-Messenger使用实例

IPC-Messenger使用实例

这份笔记主要是为了记录跨进程通信IPC的其中方法之一的Messenger的使用.
需求假设:现在2个不同的应用需要相互直接传递消息.这个时候使用AIDL 就是很好的选择.为了使这份笔记有更好的价值,这里客户端要求可以接到服务器的通知也就是说客户端让服务器做了一件事件,服务端做好了之后需要告诉客户端.也就是类似观察者模式.
注意:  Messenger的消息传递是串行的,也就是说服务端是按照顺序一个个来来处理.不适合有大量并发请求的.这个时候用使用AIDL就合适一些.

1.服务端进程
首先,我们需要在服务器创建一个Service来处理客户端的连接请求,同时创建一个Handler并通过它来创建一个Messenger对象,然后再service的onBind()中返回这个Messenger对象底层的Binder.

2.客户端进程
首先要绑定到服务端的Service,连接成功后,使用服务端放回的IBinder对象来创建一个Messenger对象,通过这个Messenger对象就可以给服务端发送消息了.发送的消息为Message对象.如果需要服务器能否在处理完成客户端发送的消息之后给客户端一个回复,就需要在客户端在创建一个新的Messenger,并把这个Messenger通过消息对象Message的参数replyTo传递到服务端.服务器就可以通过这个replyTo参数来给客户端发送消息,从而到达回复客户端的要求.

3.代码实现

3.1服务端代码实现
AndroidManifest.xml
 <service android:name="com.example.messenger.MessengerService"
            android:process=":other2">
        </service>  

MessengerService.java
   
   
  1. package com.example.messenger;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.IBinder;
  7. import android.os.Message;
  8. import android.os.Messenger;
  9. import android.os.RemoteException;
  10. import android.util.Log;
  11. public class MessengerService extends Service {
  12. private static final String TAG = "MessengerService";
  13. private final int ADDBOOK = 1001;
  14. private final int ADDBOOK_SUCCESSED = 1002;
  15. private Messenger mMessenger = new Messenger(new MessengerHandler());
  16. @Override
  17. public IBinder onBind(Intent intent) {
  18. return mMessenger.getBinder();
  19. }
  20. private class MessengerHandler extends Handler{
  21. @Override
  22. public void handleMessage(Message msg) {
  23. switch (msg.what) {
  24. case ADDBOOK:
  25. Bundle bundle = msg.getData();
  26. String name = bundle.getString("name");
  27. Log.d(TAG,"add book name=" + name);
  28. Messenger client = msg.replyTo;
  29. Message relpyMessage = Message.obtain(null, ADDBOOK_SUCCESSED);
  30. Bundle b = new Bundle();
  31. b.putString("reply_msg", "已經接到你的要求并处理!");
  32. relpyMessage.setData(b);
  33. try {
  34. client.send(relpyMessage);//给客户端回复消息
  35. } catch (RemoteException e) {
  36. e.printStackTrace();
  37. }
  38. break;
  39. default:
  40. super.handleMessage(msg);
  41. break;
  42. }
  43. }
  44. }
  45. }

3.2客户端代码实现

   
   
  1. package com.example.messenger;
  2. import com.example.demo1.R;
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.ServiceConnection;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.os.IBinder;
  11. import android.os.Message;
  12. import android.os.Messenger;
  13. import android.os.RemoteException;
  14. import android.util.Log;
  15. import android.view.View;
  16. import android.view.View.OnClickListener;
  17. import android.widget.Button;
  18. import android.widget.TextView;
  19. public class MessengerActivity extends Activity implements OnClickListener{
  20. private static final String TAG = "MessengerActivity";
  21. private static final int ADDBOOK = 1001;
  22. private static final int ADDBOOK_SUCCESSED = 1002;
  23. private TextView tv;
  24. private Messenger mGetReplyMessenger = new Messenger(new MessengerReplyHandler());
  25. private Messenger mService;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_binder);
  30. Button send = (Button)findViewById(R.id.bt_send);
  31. send.setOnClickListener(this);
  32. tv = (TextView)findViewById(R.id.tv_msg_response);
  33. bindService(new Intent(this, MessengerService.class), mConn, Context.BIND_AUTO_CREATE);
  34. }
  35. private ServiceConnection mConn = new ServiceConnection() {
  36. @Override
  37. public void onServiceDisconnected(ComponentName name) {
  38. mService = null;
  39. }
  40. @Override
  41. public void onServiceConnected(ComponentName name, IBinder service) {
  42. mService = new Messenger(service);
  43. }
  44. };
  45. @Override
  46. public void onClick(View v) {
  47. Message m = Message.obtain(null, ADDBOOK);
  48. Bundle b = new Bundle();
  49. b.putString("name", "书名:Android xxx");
  50. m.setData(b);
  51. m.replyTo = mGetReplyMessenger;//给客户端设置一个用于给客户端回调的Messenger
  52. try {
  53. mService.send(m);
  54. } catch (RemoteException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. class MessengerReplyHandler extends Handler{
  59. @Override
  60. public void handleMessage(Message msg) {
  61. switch (msg.what) {
  62. case ADDBOOK_SUCCESSED:
  63. String response = msg.getData().getString("reply_msg");
  64. Log.d(TAG, "response=" + response);
  65. tv.setText(response);
  66. break;
  67. default:
  68. super.handleMessage(msg);
  69. break;
  70. }
  71. }
  72. }
  73.     @Override
  74.     protected void onDestroy() {
  75.         unbindService(mConn);
  76.         super.onDestroy();
  77.     }
  78. }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值