`
我要阳光
  • 浏览: 59558 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Service与Component通信

阅读更多
Service绑定到Android Component组件上,其通讯方式一般是如下三种

1. 在onBind(Intent intent)中返回Binder对象,通过此接口与Service交互

2. 通过IBinder对象创建一个Messenger,通过Handler的方式来与Service交互

3. 通过AIDL进行交互

第一种返回Binder的方式是最为方便的,因为可以在Binder中直接返回Service实例,使Component直接与 Service 通信。
但是存在一个局限性,就是只有在Service与Component在同一个进程中的时候才可以通过Binder的方式进行,如果这个Service是一个程序内部使用的,那么这种方式是首选的通信方式。
其中需要注意的是:当多个Component绑定到同一个Service的时候,系统只会在第一个Component进行绑定的时候调用onBind方法,而其他的Component在绑定的时候,直接返回第一个返回的Binder,也就是说,多个组件是用的同一个Binder。
如果企图在不同进程间返回Binder,系统会在运行时报错。

第二种是通过一个Messenger进行交互,Messenger的创建和使用都很简单,如下:
    
    //在Service中
    @Override
    public IBinder onBind(Intent arg0) {
        return mMessenger.getBinder();
    }
    
    private Messenger mMessenger = new Messenger(new HelloHandler());

    class HelloHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
            super.handleMessage(msg);
        }
    }


    //在Activity中
    private Messenger mMessenger ;
    private ServiceConnection sc = new ServiceConnection(){

        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(TAG, "服务连接");
            mMessenger = new Messenger(service);
            mBound = true;
        }

        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "断开服务");
            mBound = false;
        }
    };


这样就可以通过发送消息的方式来与Service沟通了,其中Messenger的优势在于,他可以在Service与Compontent位于不同进程的时候来通信,这个是Binder方式无法做到的,Messenger底层是使用AIDL实现的。

一般来说前两种可以满足大多数程序的需求,如果要做并发处理的Service,那么要使用AIDL来实现,具体见http://developer.android.com/guide/developing/tools/aidl.html
0
0
分享到:
评论

相关推荐

    service-component:一个简单的服务组件架构

    将各种组件组装在一起以创建业务解决方案服务:创建用于远程访问组件和组合功能的界面组合,服务及其与组件的关系是在动态描述符文件中定义的,因此可以实现每个组件,而无论其如何与其他组件通信。这个框架是关于...

    Angular2 Service实现简单音乐播放器服务

    如果说组件系统(Component)是ng2应用的躯体,那把服务(Service)认为是流通于组件之间并为其带来生机的血液再合适不过了。组件间通信的其中一种优等选择就是使用服务,在ng1里就有了广泛使用,而ng2保持了服务的全部...

    服务计算与大数据.pdf

    DCOM(Distributed Component Object Model 分布式组件对象模型) J2EE WWW (2)Web Service 是一种用 URI 标识的软件应用,它的接口和绑定可以通过 XML 文档定义、描述和发现。Web Service 支持通过基于 Internet ...

    javascript与webservice的通信实现代码

    在我这里,我选择将xml直接转换为json,以便后续javascript应用的处理。... using System.ComponentModel; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using Syst

    一种基于Spring的轻量级面向服务组件框架 (2010年)

    面向服务组件将面向服务的概念引入组件模型中,支持松耦合的面向服务应用软件的开发。本文提出一种基于spring框架的轻量级面向服务组件框架SSCF(Spring-...该框架简化了面向服务组件的开发,与SCA(service component

    TTCN3核心语言 原版

    系统适配器SA负责与IUT的通信细节,即抽象服务原语(Abstract Service Primitive,ASP)和协议数据单元PDU(Protocol Data Unit,PDU)的发送和接收。编解码器CD负责TTCN-3数据和ASP/PDU之间的双向转换。组件管理器...

    android 面试2

    service不包含可见的用户界面,而是在后台无限地运行可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信 broadcast receiver是一个接收广播消息并作出回应的component,broadcast ...

    COM实验报告.pdf

    --Shine Chen 1 进程内 COM 组件的实现 1 实验目的 Microsoft 的 COM(Component Object Model)是目前比较流行的软件开发技术之一,它是基于组件 模型的一种规范。本实验实际演示一个 COM 组件的应用,加深对 COM ...

    Nucleus OS源码结构以及参考手册

    3.3 任务通信 3.3.1 邮箱 3.3.2 队列 3.3.3 管道 3.4 任务同步 3.4.1 信号量(semaphores) 3.4.2 事件集 3.5 定时器 …… 2、Nucleus_PLUS源码分析.pdf 内容 第一章.介绍手册的目的 关于Nucleus PLUS Nucleus ...

    AngularHTTPRequest:在本教程中,我们将看到Angular 6 Http Get Example。 大多数现代的前端应用程序都通过HTTP协议与后端服务进行通信。 他们通过API进行通信。 @angularcommonhttp中的HttpClient为基于XMLHttpRequest接口的Angular应用程序提供了简化的客户端HTTP API。

    运行ng generate component component-name生成一个新的组件。 您还可以使用ng generate directive|pipe|service|class|guard|interface|enum|module 。 建造 运行ng build来构建项目。 构建工件将存储在dist/目录中...

    Android实例代码

    10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:...

    疯狂Android讲义源码

     10.1.3 绑定本地Service并与之  通信 377  10.1.4 Service的生命周期 381  10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383...

    tallerAngular:练习Angular模块化,组件之间的通信

    代码脚手架运行ng generate component component-name生成一个新的组件。 您还可以使用ng generate directive|pipe|service|class|guard|interface|enum|module 。建造运行ng build来构建项目。 构建工件将存储在...

    疯狂Android讲义.part1

    10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端...

    安卓毕业设计app源码-moj-template-rn:我的模板-RN

    container作为component的容器,负责与redux、service通信,获取、保存、加工数据。 react-navigation用于导航和管理页面(container) 4. 开发指南 4.1 开发方式 使用android模拟器进行开发和调试,原因基于以下...

    PowerTCP SNMP Tool Suite—可方便构造、处理SNMP的网络控

    用于网络设备和应用程序的通信。PowerTCP SNMP Tool是一个控件集合,它通过SNMPv1或SNMPv2以及ASN.1标准来管理网络设备和应用程序,具有最高的标准兼容性和速度。它包含一个Agent Control和一个Manager Control——...

    android手机音乐播放器实训报告final.doc

    Intent是Android中的重要组件,可以被认为是不同组件之间通信的"媒介"或者"信使" 。使用它可以启动Activity,Service还可以发起一个广播(Broadcast)。Intent对象 由Action、Data、Category、Component和Extra组成...

Global site tag (gtag.js) - Google Analytics