首页 > 代码库 > 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实现)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。