2019独角兽企业重金招聘Python工程师标准>>>

我们使用Handler都是在一个进程中使用的,如何跨进程使用Handler?

其实这个问题不难解决,自己动手对binder进行一些封装就可以简单实现。但是当你看系统源码,就会发现,其实这些android都已经为我们做好了。

使用android系统的android.os.Messenger可以很方便的跨进程使用Handler。下面是示例程序。

首先是服务端。

public class MessengerTestService extends Service {protected static final String TAG = "MessengerTestService";private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:Log.d(TAG, "收到消息");//获取客户端message中的Messenger,用于回调final Messenger callback = msg.replyTo;try {// 回调callback.send(Message.obtain(null, 0));} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;}}};@Overridepublic IBinder onBind(Intent intent) {return new Messenger(mHandler).getBinder();}}

然后是客户端

public class MainActivity extends Activity {protected static final String TAG = "MainActivity";Messenger messenger;Messenger reply;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);reply = new Messenger(handler);Intent intent = new Intent();intent.setClassName("test.messenger", "test.messenger.MessengerTestService");// 绑定服务bindService(intent, new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Toast.makeText(MainActivity.this, "bind success", 0).show();messenger = new Messenger(service);}}, Context.BIND_AUTO_CREATE);}public void sendMessage(View v) {Message msg = Message.obtain(null, 1);// 设置回调用的Messengermsg.replyTo = reply;try {messenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Log.d(TAG, "回调成功");}};
}

客户端绑定服务端,获取远程Messenger的binder对象。调用Messenger的send函数,就可以吧Message发送至服务端的Handler。

同时,如果需要服务端回调客户端(往客户端的Handler发消息),则可以在send的Message中设置replyTo,服务端就可以往客户端发送消息了。

下面我们看下Messenger的源码,还是很简单的。

构造函数

    public Messenger(Handler target) {mTarget = target.getIMessenger();  }

Handler.getIMessenger()返回的是一个IMessenger的binder对象,它的send方法将会调用Handler的sendMessage方法。

    public void send(Message message) throws RemoteException {mTarget.send(message);}

转载于:https://my.oschina.net/u/1177694/blog/687772

Android中Messenger的使用相关推荐

  1. Android中Messenger进程间通信

    基于消息的进程间通信的方式,不需要编写aidl文件,使用更加简单方便. 客户端和服务端都用Messenger来发送数据,用Handler来处理数据.Messenger处理数据依靠Handler,所以是 ...

  2. Android中所有API和对应权限的数据结构构建

    #写在前面的话 这是一篇有毒博客,我觉得,读者慎入. 我想说,那个最底下的广告怎么去,辣眼睛- T -T 当然,你也可以帮我点下我的,在这里跪谢大家 https://www.captainbed.ne ...

  3. [转]Android中程序与Service交互的方式——交互方式

    本文转自:http://blog.csdn.net/yihongyuelan/article/details/7216188 上一篇文章:Android中程序与Service交互的方式--综述 简述了 ...

  4. 详细讲解Android中的Message的源码

    相信大家对于Android中的Handler是在为熟悉不过了,但是要知道,Handler就其本身而言只是一个壳子,真正在内部起到作用的是Message这个类,对于Message这个类,相信大家也不会陌 ...

  5. android中开启线程处理,Android线程与消息处理

    一.实现多线程 1.创建线程 (1)通过Thread创建线程 Thread thread = new Thread(new Runnable(){ @Override public void run( ...

  6. Android中的IPC机制

    Android IPC简介 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程 ...

  7. Android中的多线程编程与异步处理

    Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...

  8. android中进程间通信的几种方式

    进程间通信(IPC)方式 使用Bundle 使用文件共享 使用Messenger 使用AIDL 使用COntentProvider 使用Socket 一.使用Bundle 我们都知道Android中三 ...

  9. Android中进程间通信(IPC)方式总结

    IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程.在PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨. 在 ...

最新文章

  1. mysql中group_contact函数的使用
  2. linux中各种文件的颜色表示是什么意思?
  3. Mac OS X工具:版本控制SVN
  4. HDU - 1556 Color the ball(树状数组)
  5. OSI七层模型具体解释
  6. Linux下首次操作MySQL失败
  7. 公司的费用报销系统【为什么不好用】?做业务系统软件的可以参考一下
  8. 耗时一个月,整理出这份Hadoop吐血宝典
  9. Gentle.Net学习笔记四:修改代码,使用Oracle数据库
  10. python清空集合_python集合的操作
  11. 太赞了!智能语音技术年终报告:谢磊教授、王赟博士、罗艺博士…
  12. 关于”要执行请求的操作,WordPress需要访问您网页服务器的权限”
  13. java正则表达式验证_Java中的正则表达式电话号码验证
  14. 修改计算机系统参数软件,机器码修改专家(修改电脑机器码工具) v2.0官方版
  15. linux文件解压与压缩命令
  16. 怎么将抖音上的多个视频合成一个视频
  17. EMQ压力测试及系统优化(单机11万并发连接)
  18. 魅族16t无法点击计算机传输,魅族16T如何打开USB调试模式连接电脑 魅族16T一键开启游戏模式方法教程...
  19. 【Matlab学习手记】Matlab积分问题
  20. 论文阅读笔记----《Explaining Answers with Entailment Trees》

热门文章

  1. fcntl函数参数F_GETPIPE_SZ、F_SETPIPE_SZ报错引出的关于linux-specific头文件的使用方法...
  2. 2017-7-22 NOIP模拟赛
  3. js 判断是否是IE浏览器及ie版本
  4. JSP生成静态html网页
  5. [nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library...
  6. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
  7. [SQL]批量修改存储过程视图
  8. 字符串处理:布鲁特--福斯算法
  9. UVA11019 Martix Matcher --- AC自动机
  10. [eslint-plugin-vue] [vue/no-unused-vars] 'scope' is defined but never used.