Android 进程间通信 Messenger
来源:互联网 发布:linux安装tgz文件 编辑:程序博客网 时间:2024/06/05 07:01
Android进程间通信 Messenger 允许实现基于消息的进程间通信的方式
可以看到,我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。此外,还支持,记录客户端对象的Messenger,然后可以实现一对多的通信
Messenger使用步骤
以下是如何使用Messenger的步骤:
1. Service需要实现一个Hanlder,用以处理从客户端收到的消息
2. 用该Handler创建一个Messenger对象,Messenger对象内部会引用该Handler对象
3. 用创建好的Messenger对象获得一个IBinder实例,并且将该IBinder通过Service的onBind方法返回给各个客户端
4. 客户端通过收到的IBinder对象实例化一个Messenger对象,该Messenger内部指向指向Service中的Handler。客户端通过该Messenger对象就可以向Service中的Hanlder发送消息。
5. Service中的Hanlder收到消息后,在Handler中的handleMessage方法中处理消息。
6. 通过上面的第4步与第5步,就完成了客户端向Service发送消息并且Service接收到消息的单向通信过程,即客户端 -> Service。如果要实现Service向客户端回消息的通信过程,即Service -> 客户端,那么前提是在客户端中也需要像Service一样内部维护有一个指向Handler的Messenger。当在第四步中客户端向Service发送信息时,将Message的replyTo属性设置为客户端自己的Messenger。这样在第5步Service在Handler的handleMessage中处理收到的消息时,可以通过Message的Messenger再向客户端发送Message,这样客户端内维护的Handler对象就会收到来自于Service的Message,从而完成Service向客户端发送消息且客户端接收到消息的通信过程。
综上六步就能完成客户端与Service的跨进程双向通信过程:
客户端 -> Service -> 客户端
Messenger Server端
package com.fate.messengerserver;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.util.Log;public class MessengerService extends Service { private static final int MSG_SUM = 0x110; //clientMessenger表示的是客户端的Messenger,可以通过来自于客户端的Message的replyTo属性获得, //其内部指向了客户端的ClientHandler实例,可以用clientMessenger向客户端发送消息 private Messenger clientMessenger = null; //serviceMessenger是Service自身的Messenger,其内部指向了ServiceHandler的实例 //客户端可以通过IBinder构建Service端的Messenger,从而向Service发送消息, //并由ServiceHandler接收并处理来自于客户端的消息 private Messenger serviceMessenger = new Messenger(new ServiceHandler()); //MyService用ServiceHandler接收并处理来自于客户端的消息 private class ServiceHandler extends Handler { @Override public void handleMessage(Message msgfromClient) { Message msgToClient = Message.obtain(msgfromClient);//返回给客户端的消息 switch (msgfromClient.what) { //msg 客户端传来的消息 case MSG_SUM: msgToClient.what = MSG_SUM; try { //模拟耗时 Thread.sleep(1000); msgToClient.arg2 = msgfromClient.arg1 + msgfromClient.arg2; //通过Message的replyTo获取到客户端自身的Messenger, //Service可以通过它向客户端发送消息 clientMessenger = msgfromClient.replyTo; clientMessenger.send(msgToClient); Log.i("fate","Messenger Server -> result "+msgToClient.arg2); } catch (InterruptedException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } break; } super.handleMessage(msgfromClient); } } @Override public void onCreate() { Log.i("fate", "Messenger Server -> onCreate"); super.onCreate(); } @Override public IBinder onBind(Intent intent) { Log.i("fate", "Messenger Server -> onBind"); //获取Service自身Messenger所对应的IBinder,并将其发送共享给所有客户端 return serviceMessenger.getBinder(); } @Override public void onDestroy() { Log.i("fate", "Messenger Server -> onDestroy"); clientMessenger = null; super.onDestroy(); }}服务端就一个Service,可以看到代码相当的简单,只需要去声明一个Messenger对象,然后onBind方法返回mMessenger.getBinder();
然后坐等客户端将消息发送到handleMessage想法,根据message.what去判断进行什么操作,然后做对应的操作,最终将结果通过 msgfromClient.replyTo.send(msgToClient);返回。
Service注册
<service android:name=".MessengerService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.fate.messenger.client"></action> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></service>
Messenger Client端
package com.fate.messengerclient;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = "fate"; private static final int MSG_SUM = 0x110; private Button mBtnAdd, mBindBtn, mUnBindBtn; private LinearLayout mLyContainer; //显示连接状态 private TextView mTvState; private Messenger mService; private boolean isConn; private Messenger mMessenger = new Messenger(new Handler(){ @Override public void handleMessage(Message msgFromServer) { switch (msgFromServer.what) { case MSG_SUM: TextView tv = (TextView) mLyContainer.findViewById(msgFromServer.arg1); tv.setText(tv.getText() + "=>" + msgFromServer.arg2); break; } super.handleMessage(msgFromServer); } }); private ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i("fate","Messenger Client -> onServiceConnected"); mService = new Messenger(service); isConn = true; mTvState.setText("connected!"); } @Override public void onServiceDisconnected(ComponentName name) { Log.i("fate","Messenger Client -> onServiceDisconnected"); mService = null; isConn = false; mTvState.setText("disconnected!"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvState = (TextView) findViewById(R.id.id_tv_callback); mBtnAdd = (Button) findViewById(R.id.id_btn_add); mLyContainer = (LinearLayout) findViewById(R.id.id_ll_container); mBtnAdd.setOnClickListener(this); //开始绑定服务 bindServiceInvoked(); } private void bindServiceInvoked() { Intent intent = new Intent(); intent.setAction("com.fate.messenger.client"); intent.setPackage("com.fate.messengerserver"); bindService(intent, mConn, Context.BIND_AUTO_CREATE); Log.i("fate", "Messenger Client -> bindService invoked !"); } @Override protected void onDestroy() { Log.i("fate", "Messenger Client -> onDestroy "); super.onDestroy(); unbindService(mConn); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.id_btn_add: try { int a = (int) (Math.random() * 100); int b = (int) (Math.random() * 100); //创建一个tv,添加到LinearLayout中 TextView tv = new TextView(MainActivity.this); tv.setText(a + " + " + b + " = caculating ..."); tv.setId(a); mLyContainer.addView(tv); Message msgFromClient = Message.obtain(null, MSG_SUM, a, b); msgFromClient.replyTo = mMessenger; if (isConn) { //往服务端发送消息 mService.send(msgFromClient); } } catch (RemoteException e) { e.printStackTrace(); } break; } }}
首先bindService,然后在onServiceConnected中拿到回调的service(IBinder)对象,通过service对象去构造一个mService =new Messenger(service);然后就可以使用mService.send(msg)给服务端了。
那么服务端会收到消息,处理完成会将结果返回,传到Client端的mMessenger中的Handler的handleMessage方法中。
fate : Messenger Client -> bindService invoked !fate : Messenger Server -> onCreatefate : Messenger Server -> onBindfate : Messenger Client -> onServiceConnectedfate : Messenger Server -> result 65fate : Messenger Client -> onDestroy fate : Messenger Server -> onDestroy
相关文章
http://blog.csdn.net/lmj623565791/article/details/47017485
http://blog.csdn.net/iispring/article/details/48329925
http://blog.csdn.net/qq379454816/article/details/52573476
- Android Messenger 进程间通信
- Android 进程间通信 Messenger
- android进程间通信之Messenger
- Android进程间通信之Messenger
- Android进程间通信(一):Messenger
- Android 进程间通信-Intent、Messenger、AIDL
- Android进程间通信之使用Messenger
- Android使用Messenger实现进程间通信
- Android进程间通信之Messenger浅析
- Android进程间通信之使用Messenger
- Android进程间通信(IPC)之Messenger
- 初识Android进程间通信之---Messenger
- android 进程间通信值Messenger
- Android进程间通信之Messenger
- android-----IPC进程间通信之Messenger
- Android 进程间通信之Messenger
- android—进程间通信之Messenger
- Android 进程间通信之使用Messenger
- 671
- vue基础知识
- spring boot could not resolve placeholder in string value 问题解决方法
- 使用rdo配置answer.ini网桥,实现创建能与外网通信的网络
- Android开发之Tween(补间动画)
- Android 进程间通信 Messenger
- linux服务监测 自动启动
- SwitchHosts—hosts管理利器
- swift中的!和?作用
- 什么样的Web开发框架才是好的前端框架
- 剑指offer——59.按之字形顺序打印二叉树
- sockaddr和sockaddr_in的区别
- Liquibase 筆記
- 浅述经典的4种卷积网络之(2)VGGNet