首页 > 代码库 > Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

步骤:

服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。

新建一个服务端(Service)

 1 package com.example.service_messenges; 2  3 import android.annotation.SuppressLint; 4 import android.app.Service; 5 import android.content.Intent; 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 import android.widget.Toast;12 13 public class MessengesService extends Service {14 15     public static final int SAY_MSG = 0x1;16     // 创建一个信使对象,并绑定信使处理器,由信使处理器来处理17     private Messenger m = new Messenger(new InComingHandler());18 19     // 用来操作msg的handler20     @SuppressLint("HandlerLeak")21     class InComingHandler extends Handler {22 23         @Override24         public void handleMessage(Message msg) {25             super.handleMessage(msg);26             switch (msg.what) {27             case SAY_MSG:28                 String name = msg.obj.toString();29                 Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐",30                         Toast.LENGTH_SHORT).show();31                 // 当我需要返回一个值的时候就再写一个信件给信使32 33                 Message m = Message.obtain();34                 m.what = SAY_MSG;35                 m.obj = "我是" + name + ",我为自己带盐";36                 try {37                     msg.replyTo.send(m);38                 } catch (RemoteException e) {39                     // TODO Auto-generated catch block40                     e.printStackTrace();41                 }42                 break;43 44             default:45                 break;46             }47 48         }49 50     }51 52     // 绑定m53     @Override54     public IBinder onBind(Intent arg0) {55         return m.getBinder();56     }57 58 }

 

然后在清单文件中进行注册

1  <service android:name="com.example.service_messenges.MessengesService"></service>

 

接着在客户端中

 1 package com.example.service_messenges; 2  3 import android.os.Bundle; 4 import android.os.Handler; 5 import android.os.IBinder; 6 import android.os.Message; 7 import android.os.Messenger; 8 import android.os.RemoteException; 9 import android.app.Activity;10 import android.content.ComponentName;11 import android.content.Context;12 import android.content.Intent;13 import android.content.ServiceConnection;14 import android.view.View;15 import android.widget.EditText;16 import android.widget.Toast;17 18 public class MainActivity extends Activity {19 20     private Messenger m;21     private boolean mBound = false;22     private EditText et;23 24     @Override25     protected void onCreate(Bundle savedInstanceState) {26         super.onCreate(savedInstanceState);27         setContentView(R.layout.activity_main);28         et = (EditText) findViewById(R.id.editText1);29     }30     private Handler handler=new Handler(){31         public void handleMessage(Message msg){32             switch (msg.what) {33             case MessengesService.SAY_MSG:34                 String info="这是传递来的→"+msg.obj.toString();35                 Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show();36                 break;37             default:38                 break;39             }40         };41     };42     private Messenger mReplyTo = new Messenger(handler);43 44     public void msgClick(View v) {45         // 这样的效率高46         Message msg = Message.obtain();47         msg.what = MessengesService.SAY_MSG;48         String name = et.getText().toString();49         msg.obj = name;50         msg.replyTo=mReplyTo;51         try {52             m.send(msg);53         } catch (RemoteException e) {54             e.printStackTrace();55         }56 57     }58 59     private ServiceConnection conn = new ServiceConnection() {60 61         @Override62         public void onServiceDisconnected(ComponentName arg0) {63             // 这里是失败了64             mBound = false;65             m = null;66         }67 68         @Override69         public void onServiceConnected(ComponentName arg0, IBinder arg1) {70             // 这里是成功了71 72             m = new Messenger(arg1);73         }74     };75 76     @Override77     protected void onStart() {78         super.onStart();79 80         Intent intent = new Intent(this, MessengesService.class);81         bindService(intent, conn, Context.BIND_AUTO_CREATE);82         mBound = true;83     }84 85     @Override86     protected void onStop() {87         super.onStop();88 89         if (mBound) {90             mBound = false;91             unbindService(conn);92         }93     }94 95 }

总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面

   通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)

Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)