Android中进程间的通信之Messenger
来源:互联网 发布:每次人口普查的数据 编辑:程序博客网 时间:2024/06/05 00:25
Android中进程间的通信之Messenger
谈到android中的IPC机制,很多人都会先想到AIDL,这里要讲的是Messenger ,利用Messenger 可以简单的实现进程间的通信。通过发送消息到handler,它是基于消息的跨进程通信。
1、先写一个服务端MessageService,并且在新开启一个进程,在onBind()中通过Hmessage对象获取binder.
package com.ricky.messagedemo;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Messenger;import android.os.Message;import android.os.RemoteException;import android.support.annotation.Nullable;import android.util.Log;public class MessageService extends Service { private Messenger Hmessage=new Messenger(new MessagerHandler()); class MessagerHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 10: Log.e("service",msg.getData().getString("message")); //打印客户端发送的消息 Messenger client=msg.replyTo; Message message=Message.obtain(null,11); Bundle mBundle=new Bundle(); mBundle.putString("client","服务端已接受到消息"); message.setData(mBundle); try { client.send(message); //通知客户端已接收到消息 } catch (RemoteException e) { e.printStackTrace(); } break; default: break; } } } @Nullable @Override public IBinder onBind(Intent intent) { return Hmessage.getBinder(); }}在AndroidManifest.xml注册服务,新开启进程为remote1<service android:name=".MessageService" android:process=":remote1"></service>
2、在Activity中绑定服务并向服务端发送消息,同时,在Activity也要写一个handler,接收服务返回过来的消息。服务端向客户端返回消息的关键replyTo,用replyTo可以在服务端接收到来自客户端的Messenger。再利用
Messenger对象给客户端返回消息。
import android.content.ComponentName;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;public class MessageActivity extends AppCompatActivity { Messenger sendService; private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 11: Log.e("client",msg.getData().getString("client")); break; } } }; ServiceConnection mConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { sendService=new Messenger(iBinder); Message mess=Message.obtain(null,10); Bundle mBundle=new Bundle(); mBundle.putString("message","客户端发送的消息"); mess.setData(mBundle); mess.replyTo=new Messenger(mHandler); //将messenger一起发送到服务端,使服务端接收到消息后返回消息通知客户端 try { sendService.send(mess); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName componentName) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); Intent service_Intent=new Intent(this,MessageService.class); bindService(service_Intent,mConnection,BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); unbindService(mConnection); }}
3、一起来看看控制台的输出结果
09-28 03:34:07.236 12979-12979/com.ricky.messagedemo:remote1 E/service: 客户端发送的消息09-28 03:34:07.266 12907-12907/com.ricky.messagedemo E/client: 服务端已接受到消息
0 0
- Android中进程间的通信之Messenger
- android进程间通信之Messenger
- Android进程间通信之Messenger
- Android进程间通信之使用Messenger
- Android进程间通信之Messenger浅析
- Android进程间通信之使用Messenger
- Android进程间通信(IPC)之Messenger
- 初识Android进程间通信之---Messenger
- Android进程间通信之Messenger
- android-----IPC进程间通信之Messenger
- Android 进程间通信之Messenger
- android—进程间通信之Messenger
- Android 进程间通信之使用Messenger
- Android进程间通信之使用Messenger
- Android进程间通信之Messenger
- Android 进程间通信之Messenger
- Android进程间通信之Messenger
- Android之进程间通信(IPC)-Messenger
- 利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
- <转>简单易懂的Git使用教程
- 探索 CSS3 中的 box-shadow 属性
- Objected-Oriented Analysis and Design (OOAD 面对对象的分析与设计)
- Java 8 forEach examples
- Android中进程间的通信之Messenger
- 多线程中lock用法的经典实例
- UVA 1262
- 剑指offer--面试题46:求1+2+3+...+n
- 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文。神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒过来,语法
- shell编程之BASH_BUILTINS
- untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
- 华为oj之计算字符个数
- play框架自定义插件plugin拦截器