使用Messenger

上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。

其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处:

1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多

2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。

不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:

  1. public class MessengerService extends Service {
  2. /** 用于Handler里的消息类型 */
  3. static final int MSG_SAY_HELLO = 1;
  4. /**
  5. * 在Service处理Activity传过来消息的Handler
  6. */
  7. class IncomingHandler extends Handler {
  8. @Override
  9. public void handleMessage(Message msg) {
  10. switch (msg.what) {
  11. case MSG_SAY_HELLO:
  12. Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
  13. break;
  14. default:
  15. super.handleMessage(msg);
  16. }
  17. }
  18. }
  19. /**
  20. * 这个Messenger可以关联到Service里的Handler,Activity用这个对象发送Message给Service,Service通过Handler进行处理。
  21. */
  22. final Messenger mMessenger = new Messenger(new IncomingHandler());
  23. /**
  24. * 当Activity绑定Service的时候,通过这个方法返回一个IBinder,Activity用这个IBinder创建出的Messenger,就可以与Service的Handler进行通信了
  25. */
  26. @Override
  27. public IBinder onBind(Intent intent) {
  28. Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
  29. return mMessenger.getBinder();
  30. }
  31. }

再看一下Activity的代码:

  1. public class ActivityMessenger extends Activity {
  2. /** 向Service发送Message的Messenger对象 */
  3. Messenger mService = null;
  4. /** 判断有没有绑定Service */
  5. boolean mBound;
  6. private ServiceConnection mConnection = new ServiceConnection() {
  7. public void onServiceConnected(ComponentName className, IBinder service) {
  8. // Activity已经绑定了Service
  9. // 通过参数service来创建Messenger对象,这个对象可以向Service发送Message,与Service进行通信
  10. mService = new Messenger(service);
  11. mBound = true;
  12. }
  13. public void onServiceDisconnected(ComponentName className) {
  14. mService = null;
  15. mBound = false;
  16. }
  17. };
  18. public void sayHello(View v) {
  19. if (!mBound) return;
  20. // 向Service发送一个Message
  21. Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
  22. try {
  23. mService.send(msg);
  24. } catch (RemoteException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.main);
  32. }
  33. @Override
  34. protected void onStart() {
  35. super.onStart();
  36. // 绑定Service
  37. bindService(new Intent(this, MessengerService.class), mConnection,
  38. Context.BIND_AUTO_CREATE);
  39. }
  40. @Override
  41. protected void onStop() {
  42. super.onStop();
  43. // 解绑
  44. if (mBound) {
  45. unbindService(mConnection);
  46. mBound = false;
  47. }
  48. }
  49. }

注意:以上写的代码只能实现从Activity向Service发送消息,如果想从Service向Activity发送消息,只要把代码反过来写就可以了。

使用AIDL

  AIDL,Android Interface Definition Language。建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:

   (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例的内容。
   (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
   (3)建立一个服务类(Service的子类)。
   (4)实现由aidl文件生成的Java接口。
   (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

Activity与Service通信(不同进程之间)的更多相关文章

  1. Activity与Service通信

    Activity与Service通信的方式有三种: 继承Binder类 这个方式只有当你的Acitivity和Service处于同一个Application和进程时,才可以用,比如你后台有一个播放背景 ...

  2. Activity与Service通信的方式有三种:

    在博客园看到的,看着挺不错的,借来分享下 继承Binder类 这个方式仅仅有当你的Acitivity和Service处于同一个Application和进程时,才干够用,比方你后台有一个播放背景音乐的S ...

  3. Android之Activity与Service通信

    一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用 ...

  4. android学习-IPC机制之ACtivity绑定Service通信

    bindService获得Service的binder对象对服务进行操作 Binder通信过程类似于TCP/IP服务连接过程binder四大架构Server(服务器),Client(客户端),Serv ...

  5. activity 与 service 之间的通信

    activity和service通信:通过binder 举个我实际项目中的例子:在service中下载更新应用 首先是下载更新apk的service: public class UpdateVersi ...

  6. 201709012工作日记--activity与service的通信机制

    service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...

  7. Android四大组件应用系列——Activity与Service交互实现APK下载

    Servic与Activity相比它没有界面,主要是在后台执行一些任务,Service有两种启动方法startService()和bindService(),startService方式Service ...

  8. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  9. activity与service进程内通信

    package com.example.binbin.testbinder; import android.app.Service; import android.content.Intent; im ...

随机推荐

  1. 初学java之异常类

    //异常类 package st; public class example_1 { public static void main(String args[]) { int n=0,m=0,t=10 ...

  2. 从 bcp 客户端收到一个对 colid x 无效的列长度。

    出现场景: 批量插入数据的时候出现这个问题. 原因分析:某个数据的长度应该是大于这个数据对应的列的定义长度. 所以一一检查到底是那个列的长度超出了. 第一种方法: ——————————2017-1-3 ...

  3. css3导航-磊哥

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  4. [转]Arrays.sort()你应该知道的事

    以下内容转自: 原文链接: programcreek 翻译: ImportNew.com- 刘志军 译文链接: http://www.importnew.com/8952.html --------- ...

  5. JBOss启动只能在本机访问的解决办法

    环境CentOS6.4_X64 JBoss:5.1.2 eap 启动:JBOSS_HOME/bin/run.sh 在本机可以通过http://localhost:8080访问,而其他机器无论是通过机器 ...

  6. Graphical installers are not supported by the vm

    http://www-01.ibm.com/support/docview.wss?uid=swg21462180 Technote (troubleshooting) Problem(Abstrac ...

  7. 使用MediaRecorder录制视频短片

    MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...

  8. swift 开眼今日精选

    swift 开眼今日精选 import UIKit class TodayController: UITableViewController { vararray =NSMutableArray() ...

  9. android程序打包成APK

    1.下载ant(从官网上下载没有bin目录,可以直接在百度上搜APACHE-ANT-1.9.4-BIN.ZIP) 2.解压到C盘根目录(也可以是其他盘) 3.修改环境变量 ANT_HOME    C: ...

  10. windbg调试C#代码(二)

    这篇主要讲如何分析高内存和高CPU. 1.如何分析高内存 注:如果抓Dump的同时,刚好在执行GC,抓出来的Dump执行命令多半会出错,用!VerifyHeap也能验证Dump有误,这种情况只能重新抓 ...