Win32 COM组件 x Android Service
有些书在介绍和讲解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的更多相关文章
- Win32 COM组件 x Android Service (二)
		
继续上一篇. 如果不使用AIDL(Android Interface Definition Language接口描述语言)编写服务接口的话,(COM组件,CORBA组件,ICE组件以及其它远程调用框架 ...
 - Android组件系列----Android Service组件深入解析
		
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
 - Android 四大组件之二(Service)
		
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
 - Android Service组件(1)
		
android service 和其他服务一样,并没有实际运行的界面,它运行在android 后台.一般通过service为应用程序提供服务(比如,从Internet下载文件,控制音乐播放器等).Se ...
 - [Android四大组件之二]——Service
		
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...
 - android Service介绍
		
一.简介 android中service(服务)运行于后台,没有界面.和其他组件一样,service也运行在主线程中,因此不能用它来做耗时的请求或者动作.可以在服务中开启线程,在线程中做耗时操作.可以 ...
 - Android Service完全解析,关于服务你所需知道的一切(上)
		
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
 - Android Service学习之本地服务
		
Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...
 - Android:Service的非绑定式的创建和生命周期
		
Android的Service若使用非绑定式的创建,则创建后将无法再与它取得联系.即无法传递消息參数等: 所以假设希望创建后仍然与其存在联系,那么能够參考我的前几篇博客<Android:Serv ...
 
随机推荐
- Twitter-Snowflake:自增ID算法
			
简介 Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,后来团队就研究如何产生完美的自增ID,以满足两个基本的要求: 每秒能生成几十万条 ID ...
 - 9i oracle数据库迁移到11G(exp)
			
这个是之前生产上打算迁移的文档,后面离职了没有在停机迁移,但是测试过几次没有问题,其中需要把9I的110,120库迁移到11g一个数据库中,但是110,120库之间有相同的表名字,以及有DBLINK. ...
 - spring cloud(Greenwich SR)- Eureka
			
spring cloud study 本次学习基于spring cloud Greenwich SR1 版本 学习要点: Spring Boot/Spring Cloud应用开发套路 加依赖 加注解 ...
 - ssh终端远程登陆主机命令--笔记
			
ssh终端远程登陆主机命令 ssh user@host ssh optadmin@10.55.45.38
 - Redis(四)Jedis客户端
			
一.客户端通信协议 二.Java客户端Jedis 1.获取Jedis Jedis属于Java的第三方开发包,在Java中获取第三方开发包通常有两种方式: 直接下载目标版本的Jedis-${versio ...
 - hystrix原理
			
一.hystrix 产生背景 微服务是解决复杂服务的一个方案,在功能不变的情况下,对一个复杂的单体服务分解为多个可管理的分支.每个服务作为轻量的子服务,通过RPC实现服务间的关联,将服务简单化.每个服 ...
 - 论RSA算法的重要性 -RSA 简介
			
地球上最重要的算法 (这个说法似乎有点夸张了,但是当你了解了RSA算法后,就觉得不夸张了.) 如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易.上一篇文章 ssh 协议为什 ...
 - 前端技术之:JavaScript Test 断言库
			
expect 声称可以写更好的断言. https://github.com/mjackson/expect chai 可以写BDD样式的断言,也可以写TDD样式的断言,可用于Node.js与浏览器 ...
 - (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)
			
1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成 ...
 - Web for pentester_writeup之Code injection篇
			
Web for pentester_writeup之Code injection篇 Code injection(代码注入) Example 1 <1> name=hacker' 添加一个 ...