博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Service之Messenger实现通信
阅读量:6872 次
发布时间:2019-06-26

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

hot3.png

  1. 从类Binder派生如果你的service是你自己应用的私有物,并且与客户端运行于同一个进程中(一般都这样),你应该通过从类Binder派生来创建你的接口并且从onBind()返回一它的实例.客户端接收这个Binder然后使用它来直接操作所实现的Binder甚至Service的公共接口.当你的service仅仅是一个后台工作并且仅服务于自己的应用时,这是最好的选择.唯一使你不能以这种方式创建你的接口的理由就是你的service被其它应用使使用或者是跨进程的.

  2. 使用一个Messenger如果你需要你的接口跨进程工作,你可以为service创建一个带有Messager的接口.在此方式下,service定义一个Handler来负责不同类型的Message对象.这个Handler是Messenger可以与客户端共享一个IBinder的基础,它允许客户端使用Message对象发送命令给servic.客户端可以定义一个自己的Messenger以使service可以回发消息.这是执行IPC的最简单的方法,因为Messenger把所有的请求都放在队列中依次送入一个线程中,所以你不必把你的service设计为线程安全的

  3. 使用AIDLAIDL(Android接口定义语言)执行把对象分解为操作系统能够理解并能跨进程封送的基本体以执行IPC的所有的工作.上面所讲的使用一个Messenger,实际上就是基于AIDL的.就像上面提到的,Messenger在一个线程中创建一个容纳所有客户端请求的队列,使用service一个时刻只接收一个请求.然而,如果你想要你的service同时处理多个请求,那么你可以直接使用AIDL.在此情况下,你的service必须是多线程安全的.要直接使用AIDL,你必须创建一个.aidl文件,它定义了程序的接口.AndroidSDK工具使用这个文件来生成一个实现接口和处理IPC的抽象类,之后你在你的service内派生它.

    注:大多数应用不应使用AIDL来处理一个绑定的service,因为它可能要求有多线程能力并且导致实现变得更加复杂.同样的,AIDL也不适合于大多数应用并且本文档不会讨论如何在你的service中使用它.如果你确定你需要直接使用AIDL,请看AIDL的文档.

    Service

public class MyService extends Service { Messenger messenger = null; Messenger replyMessenger = null;  public MyService() { }  @Override public void onCreate() {  super.onCreate();  messenger = new Messenger(handler);//实例化一个对象,并将Handler传入绑定,UI MQ消息检测 }  Handler handler = new Handler(){  public void handleMessage(android.os.Message msg) {   Log.d("","Msg:" + msg.what + ";" + msg.obj);    replyMessenger = msg.replyTo;   } };   @Override public IBinder onBind(Intent arg0) {  return messenger.getBinder();//返回Binder接口 }}

Activity

private Messenger messenger;private Messenger sendMessenger;  Handler handler = new Handler() {  @Override          public void handleMessage(Message msg) {      System.out.println("acitivty handler");                  super.handleMessage(msg);  } };   @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  bindService(new Intent(this,MyService.class), conn, Context.BIND_AUTO_CREATE);//一样绑定一个Connection  sendMessenger = new Messenger(handler);  } private ServiceConnection conn = new ServiceConnection() {  @Override  public void onServiceDisconnected(ComponentName cn) {  }  @Override  public void onServiceConnected(ComponentName cn, IBinder ibiner) {   messenger = new Messenger(ibiner);//得到Service中的Messenger   Log.d("","OK messenger connected........");  } };  public void sendMsg(int what, String msg){ //这个方法就是自己的业务信息发送消息 传递到Service中 有 Handler处理。  if (messenger == null) {   return;  }  Message msg1 = Message.obtain();  msg1.what = what;  msg1.obj = msg;  msg.replyTo = sendMessenger;   try {   messenger.send(msg1);  } catch (RemoteException e) {   e.printStackTrace();  } }

转载于:https://my.oschina.net/u/593225/blog/652604

你可能感兴趣的文章
Exchange Server 运维管理01:Exchange中Active Directory 有什么用?
查看>>
dhcp服务在企业中的应用
查看>>
linux系统管理之四:服务状态
查看>>
VMware View FAQ[一]
查看>>
【原创翻译】布尔值(boolean)
查看>>
三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器
查看>>
MySQL分库分表分表后数据的查询(5th)
查看>>
iOS-点击图片放大,再次点击返回原视图 类似查看相册的功能
查看>>
JAVA -- stateless4j StateMachine 使用浅析(二)
查看>>
oracle checkpoint
查看>>
KVM虚拟化开源高可用方案(六)ISCSI ON DRBD搭建及常见故障处理
查看>>
android device related
查看>>
iOS 6 Beta3即将发布,iPhone面板谍照已经曝光
查看>>
hadoop 源码包编译
查看>>
h5存储的优点
查看>>
Python基础之各种推导式玩法
查看>>
[HNOI/AHOI2017]影魔
查看>>
微信小程序-多级联动
查看>>
Ubuntu配置MYSQL远程连接
查看>>
docker-1-简介
查看>>