使用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. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)

    构造注入 语法: <constructor-arg>    <ref bean="bean的id"/> </constructor-arg> 1 ...

  2. SAP销售订单状态修改(审核) 计划行自动产生需求,产生MD04需求

    不知道业务怎么配置的,创建销售单时,一堆计划行类别,什么CN,DN...都有,但是审核后需要计划行变更为CP,这样在MD04才能看到需求. 原有逻辑是弄个后台程序,审核后调一下,更新一下计划行,这样是 ...

  3. HTML 基础知识——8月8日

    一.基础知识: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  4. BootStrap 最佳资源合集(转)

    witter BootStrap是一款优秀的前端的框架,称得上是前端的一个框架利器.Web前端开发者每天都在与HTML.CSS.JavaScript打交道,然 而不少人都是在周而复始的写模板.样式和交 ...

  5. layer.js定制弹窗

    <button>点击</button> <div class="order" id="order"> 定制 </div ...

  6. lazyload 分页加载

    http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/ echo $d['pic']; ?>" src=&qu ...

  7. 1800: [Ahoi2009]fly 飞行棋

    #include<cstdio> #include<iostream> using namespace std; ],n,ans; int main() { scanf(&qu ...

  8. HDU 4050 wolf5x 概率dp 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=4050 题意: 现在主角站在0处,需要到达大于n的位置 主角要进入的格子有三种状态: 0. 不能进入 1. 能进入 ...

  9. C#解析Json(多方法解析Json 一)

    解析:{'id':'4028d80858053bed0158053ef7a50001','sl':0.0,'sfyfz':'0','zwjyzsbh':'1000001600000018'} 1.新建 ...

  10. Android调用Sqlite数据库时自动生成db-journal文件的原因

    数据库为了更好实现数据的安全性,一半都会有一个Log文件方便数据库出现意外时进行恢复操作等.Sqlite虽然是一个单文件数据库,但麻雀虽小五脏俱全,它也会有相应的安全机制存在 这个journal文件便 ...