博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第18天Service-Messager实现进程间通信
阅读量:3785 次
发布时间:2019-05-22

本文共 3700 字,大约阅读时间需要 12 分钟。

第18天Service-Messager实现进程间通信

Messager

一.Messager介绍

Messager,故名思义信使的意思,能够完成跨进程通信。

二.Messager的原理

在这里插入图片描述

Messager的2个构造方法:分别以handler和Ibinder为参数
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}

我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。

特点:

  • 客户端和服务端发送的都是message
  • 使用handler接受消息(客户端和服务端都是)
  • 不需要编写aidl文件

三 .使用步骤

服务端moudle:messager_server

(1)创建服务:MyService.java

public class MyService extends Service {
//TODO 创建信使对象:参数是handler处理客户端发送来的消息 Messenger server_messager=new Messenger(new Handler(){
@Override public void handleMessage(Message msg) {
super.handleMessage(msg); //接受客户端消息 Bundle bundle=msg.getData(); String message=bundle.getString("client_message"); Toast.makeText(MyService.this, "服务器发来的消息:"+message, Toast.LENGTH_SHORT).show(); //向客户端发送消息 Messenger clientMessager = msg.replyTo;//用于获取客户端的信使 Message messenge= new Message(); Bundle bundle1=new Bundle(); bundle1.putString("server_message","客户端你是不是傻啊"); messenge.setData(bundle1); try {
clientMessager.send(messenge); } catch (RemoteException e) {
e.printStackTrace(); } } }); //TODO 返回server_messager的代理人,便于客户端获取服务端信使 @Nullable @Override public IBinder onBind(Intent intent) {
return server_messager.getBinder(); }}

(2)清单文件注册服务

OK,服务端的服务已经配置完毕

客户端moudle:messager_client

public class MainActivity extends AppCompatActivity {
//3.客户端的信使:负责接受服务器发来的消息 private Messenger Clientmesssager=new Messenger(new Handler(){
@Override public void handleMessage(Message msg) {
super.handleMessage(msg); Bundle bundle=msg.getData(); String message=bundle.getString("server_message"); Toast.makeText(MainActivity.this, "接受到服务器发来的消息"+message, Toast.LENGTH_SHORT).show(); } }); // 4. 客户端发送消息给服务端 private Messenger Servermessenger; private ServiceConnection connection=new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
Servermessenger=new Messenger(service);//获取服务端信使 Message message=new Message(); message.replyTo= Servermessenger; Bundle bundle=new Bundle(); bundle.putString("client_message","你好啊服务器"); message.setData(bundle); try {
Servermessenger.send(message); } catch (RemoteException e) {
e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) {
} }; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.绑定服务 Intent intent=new Intent(); intent.setAction("com.bawei.1609A"); intent.setPackage("com.example.messager_server"); bindService(intent,connection, Service.BIND_AUTO_CREATE); } //2.解除绑定 @Override protected void onDestroy() {
super.onDestroy(); unbindService(connection); }}
> 注意:  1.先启动服务端,在启动客户端 	 2.Message携带数据必须使用bundle不然报错

总结:

  • 服务端:
    • 接受消息: 创建Messager信使对象,参数为handler
    • 发送消息:获得客户端的信使对象
      Messenger clientMessager = msg.replyTo;
  • 客户端
    • 接受消息: 创建Messager信使对象,参数为handler
    • 发送消息:绑定服务成功创建Server端的Messager,参数为binder

转载地址:http://dwktn.baihongyu.com/

你可能感兴趣的文章
装饰器和门面设计模式介绍
查看>>
创建型模式——克隆模式
查看>>
JVM关闭和Hook钩子
查看>>
线程中断处理
查看>>
消息队列积压问题处理
查看>>
并行流使用注意事项
查看>>
泛型擦除机制及相关问题
查看>>
Jackson日期反序列化时区问题
查看>>
《设计模式》
查看>>
单例设计模式
查看>>
面试题集锦(一)
查看>>
Calendar类方法——编写万年历的两种方式
查看>>
File类的使用——遍历所有文件及子文件以及遍历删除
查看>>
内存流的使用——基本使用
查看>>
RandomAccessFile 类的使用——基本使用
查看>>
Properties实现类——基本使用
查看>>
结构型模式——装饰者设计模式
查看>>
线程的同步——Synchronized和ReentrantLock
查看>>
网络编程基础
查看>>
python实现快速排序
查看>>