有些书在介绍和讲解android的Service组件时,会使用后台服务一词,并且与运行在主线程的Activity相对。因为后台一词很容易误解,服务一直运行在后台?什么线程在运行?服务一直有条线程在运行?而且后台在不同语境有不同理解。但是如果你开发过COM应用的话,这个Service组件就很容易理解。

我们回顾是如何使用COM的,先实例一个CoInstance,然后通过IUnknown接口QueryInterface查询出我们想要的接口,然后调用接口的方法访问COM组件提供的服务。COM组件可能实例在同一进程,又或者实例在进程外的本地进程(或者远程进程)。对于自由线程的进程内组件,接口调用(COM组件的代码)运行在调用线程。对于套间线程的组件,不论是进程内还是进程外,接口调用都通过IPC(LPC或RPC)串行访问COM组件的功能。

我们来看一下android中Service的使用。
对于非系统服务的使用。
首先Context.bindService,(如果系统范围内没有服务实例则被创建),他们说绑定到一个服务,其实最重要是获取Service对应的IBinder。在这里要习惯Java或JavaScript编程中常用到的接收结果的类,这些类往往通过提供接口回调方法来接收结果。像这里的第二个参数是一个ServiceConnection类,就这样一看还以为它负责处理connect功能相关的方法,但实质上只是一个用来接收结果的回调接口。哎!没什么好说,要习惯它。

得到的这个IBinder就是我们要访问的关键,但是怎么访问,一般的书和帖都没有说明。我通过系统服务ClipboardManager(只是随手选中)代码来举例。在源代码的注释中,android团队用proxying来表述这种通过ClipboardManager对IClipboard接口照样封装一次,类似桥模式的访问。

对于系统服务的使用。
首先Context.getSystemService,我们得到系统服务接口的一个proxying封装。对于举例的ClipboardManager封装的就是对IClipboard接口的调用。
我们进入ClipboardManager源代码。

static private IClipboard getService() {
synchronized (sStaticLock) {
if (sService != null) {
return sService;
}
IBinder b = ServiceManager.getService("clipboard");
sService = IClipboard.Stub.asInterface(b);
return sService;
}
}

可以看出,还是要得到服务的IBinder。我们可以会意一笑,IClipboard.Stub.asInterface(b),不就相当于对IUnknown进行QueryInterface吗?好了,IBinder就相当于一个IUnknown,通过"目标接口.Stub.asInterface"查询目标接口,然后当然就是对不为空的接口进行访问了,访问也就是服务的提供的功能。

对于android来说,服务是一个实例,是系统范围的单例,跟服务同进程的调用运行在调用线程(也可以是主线程),在服务进程外的调用就是一种ActiveObject模式的访问,服务功能调用运行在服务进程内,接口调用进程和服务进程通过IPC传递参数和结果。 通过浏览IBinder的实现Binder的源代码,大部分功能在做ipc和proxy的工作。

对于Service除了像COM组件那样通过提供接口访问功能外,另一种途径就是处理Intent请求,这个处理就在Service.onStartCommand中进行,并不用借助IBinder。访问服务的功能通过startService(Intent)来请求一次访问,再一次吐槽,这个命名怎么都会字面理解成启动服务,其实不然,主要是通过Intent传递参数,请求一次服务。并没有Service.onPause和Service.onStop,也就是Service.onStart并不影响Service的状态,单单只是处理Intent的回调入口,哎~。PendingService则有一专用线程,通过消息方式回调PendingService.onHandleIntent串行处理所有传递进来的Intent。

另外Context.bindService也带参数Intent,并非要在Service.onBind中处理Intent请求,而是作为接口查询参数,返回不同的IBinder,你的Service可以聚集多个IBinder。

Win32 COM组件 x Android Service的更多相关文章

  1. Win32 COM组件 x Android Service (二)

    继续上一篇. 如果不使用AIDL(Android Interface Definition Language接口描述语言)编写服务接口的话,(COM组件,CORBA组件,ICE组件以及其它远程调用框架 ...

  2. Android组件系列----Android Service组件深入解析

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. Android 四大组件之二(Service)

    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...

  4. Android Service组件(1)

    android service 和其他服务一样,并没有实际运行的界面,它运行在android 后台.一般通过service为应用程序提供服务(比如,从Internet下载文件,控制音乐播放器等).Se ...

  5. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  6. android Service介绍

    一.简介 android中service(服务)运行于后台,没有界面.和其他组件一样,service也运行在主线程中,因此不能用它来做耗时的请求或者动作.可以在服务中开启线程,在线程中做耗时操作.可以 ...

  7. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  8. Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...

  9. Android:Service的非绑定式的创建和生命周期

    Android的Service若使用非绑定式的创建,则创建后将无法再与它取得联系.即无法传递消息參数等: 所以假设希望创建后仍然与其存在联系,那么能够參考我的前几篇博客<Android:Serv ...

随机推荐

  1. 子字符串查找之————关于KMP算法你不知道的事

    写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...

  2. Redis 文章一 之持久化机制的介绍

    我们已经知道对于一个企业级的redis架构来说,持久化是不可减少的 企业级redis集群架构:海量数据.高并发.高可用 持久化主要是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你re ...

  3. C#事件浅淡(1)

    最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子. 原则 1,定义一个事件信息类(标准的都继承EventArgs) 2.定义 ...

  4. SpringCloud - 概述

    Spring Cloud 什么是Spring Cloud ? SpringCloud是基于SpringBoot提供的一套一站式微服务解决方案,包括服务注册与发现(Eureka), 配置中心(Sprin ...

  5. 误删除 mySQL 用户解决办法

    误删除用户解决办法 删除用户 删除用户 mysql> truncate mysql.user;Query OK, 0 rows affected (0.05 sec)​mysql> sel ...

  6. OptimalSolution(6)--栈和队列

    一.设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.pop.push.getMin操作的时间复杂度都是O(1). 思路:设计两个栈,一 ...

  7. hash算法的应用

    一.单词模式匹配 描述:单词模式字符串为“一二二一”,目标字符串为"苹果 香蕉 香蕉 苹果"则匹配成功 a=[1,2,2,1,1,3] b=['x','y','y','x','x' ...

  8. Redis5源码解析-Sentinel

    简单的概念就不解释.基于Redis5.0.5 从Sentinel主函数触发 在sentinel.c文件的最后面可以发现sentinelTimer函数,这个就是Sentinel的主函数,sentinel ...

  9. Scrapy 实现爬取多页数据 + 多层url数据爬取

    项目需求:爬取https://www.4567tv.tv/frim/index1.html网站前三页的电影名称和电影的导演名称 项目分析:电影名称在初次发的url返回的response中可以获取,可以 ...

  10. MySQL、Oracle、SqlServer的区别

    鉴于和数据库打交道日益频繁,遂决定写一篇关于Oracle.SqlServer.MySQL区别的个人观点. MySQL是大学时的主要学习对象,但刚参加工作时转到了SqlServer,现在主要接触的是Or ...