通过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的handler 20 @SuppressLint("HandlerLeak") 21 class InComingHandler extends Handler { 22 23 @Override 24 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 block 40 e.printStackTrace(); 41 } 42 break; 43 44 default: 45 break; 46 } 47 48 } 49 50 } 51 52 // 绑定m 53 @Override 54 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 @Override 25 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 @Override 62 public void onServiceDisconnected(ComponentName arg0) { 63 // 这里是失败了 64 mBound = false; 65 m = null; 66 } 67 68 @Override 69 public void onServiceConnected(ComponentName arg0, IBinder arg1) { 70 // 这里是成功了 71 72 m = new Messenger(arg1); 73 } 74 }; 75 76 @Override 77 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 @Override 86 protected void onStop() { 87 super.onStop(); 88 89 if (mBound) { 90 mBound = false; 91 unbindService(conn); 92 } 93 } 94 95 }
总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面
通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)
时间: 2024-10-11 22:56:59