有些书在介绍和讲解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. vue css 深度选择器

    在我们想穿透的选择器前边添加 >>> 或者 /deep/ 或者 ::v-deep. 官方地址:https://vue-loader.vuejs.org/guide/scoped-cs ...

  2. linux-scp命令及如何设置免密登录

    部署测试环境时经常在两台服务器间copy文件,那么如何设置免密登录? 场景:源服务器A(如172) -> 目标服务器B(如71)  实现将服务器A的文件copy到服务器B 实现方式有两种: 在源 ...

  3. eclipse安装相关

    一 安装相关 1.下载eclipse(这里我下载了个简单版本) https://www.eclipse.org/downloads/packages/

  4. LeetCode122——Best Time to Buy and Sell Stock II

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  5. JVM 垃圾收集与内存分配

    判断对象是否还活着 引用计数法 给对象添加引用计数器,添加加1,引用失效减1,如果为0就是不可使用的.问题是不能解决互相引用带来的问题 可达性分析法 以GC Roots为起点,判断到一个对象是否有引用 ...

  6. 星云测试插装编译流程与CI集成

    星云测试Horn插装采用脚本配置方式自动对语法进行扫描和插装,在整个插装过程中需要用到星云提供的插件工具.通过与CI集成,在CI编译前通过jenkins调用星云插装插件模块进行必要的数据填充,生成对应 ...

  7. 搭建ASP.NET Core WebApi项目

    步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . 选 ...

  8. 在VMware下通过挂载系统光盘搭建本地yum仓库的方法

    一.虚拟机的安装 首先你要有一个VMware虚拟机,没有软件的朋友可以看我的前几篇博客 安装VMware虚拟机 二.进入虚拟机(在这里我们进入一个Linux虚拟机下的CentOS操作系统进行演示) 首 ...

  9. 学习笔记12JS异步请求

    *一般用JS来监听按钮事件,都应该先监听页面OnLoad事件. *Js写在哪里,就会在页面解析到哪里执行. 异步请求:所谓异步请求,就是使用JS来监听按钮点击事件,并且发送请求,等到回复后,再使用JS ...

  10. [Hadoop]HDFS机架感知策略

    HDFS NameNode对文件块复制相关所有事物负责,它周期性接受来自于DataNode的HeartBeat和BlockReport信息,HDFS文件块副本的放置对于系统整体的可靠性和性能有关键性影 ...