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。

时间: 2024-10-09 12:40:22

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

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

花了周末两天的时间,整理了一下作为Android四大组件之一的Service的基础知识,通过这篇文章,应该可以明白:对Service的理解.在什么地方使用.怎么使用.要注意哪些问题等. [本文主要内容] 一.Service的基本概念(四大组件之一)二.定义(启动)一个Service 1.如何定义(启动)一个Service: 2.停止一个started服务有两种方法 3.onStartCommand方法的返回值 三.IntentService 1.IntentService的引入 2.Intent

Android Service组件在新进程绑定(bindService)过程

1.首先看两个例子 (1)进程内 Client端 public class CounterService extends Service implements ICounterService { ...... public class CounterBinder extends Binder { public CounterService getService() { return CounterService.this; } } ...... } Server端 public class Ma

Android Service组件在进程内绑定(bindService)过程

本文参考Android应用程序绑定服务(bindService)的过程源代码分析http://blog.csdn.net/luoshengyang/article/details/6745181和<Android系统源代码情景分析>,作者罗升阳 一.Android Service组件在进程内绑定(bindService)过程 0.总图流程图如下: 1.Counter和CounterService所在应用程序主线程向ActivityManagerService进程发送BIND_SERVICE_T

【ALearning】第五章 Android相关组件介绍(二)Service

Service是Android中的四大组件之一,所以在Android开发过程中起到非常重要的作用.下面我们来看一下官方对Service的定义. A Service is an application component thatcan perform long-running operations in the background and does not provide auser interface. Another application component can start a se

Android Service组件在新进程中的启动过程

1.startService 在Android系统匿名共享内存(Anonymous Shared Memory)Java调用接口分析,http://blog.csdn.net/jltxgcy/article/details/31414509一文,Client调用了如下代码: public class Client extends Activity implements OnClickListener { public void onCreate(Bundle savedInstanceState

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

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android -- Service绑定解绑和aidl

Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的. 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder. 绑定是异步的,bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给b

Android Service(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

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

Android的Service若使用非绑定式的创建,则创建后将无法再与它取得联系,即无法传递消息参数等: 所以如果希望创建后仍然与其存在联系,那么可以参考我的前几篇博客<Android:Service的绑定和解绑定,Service与Activity通信>,其中讲到了Service的绑定和与Activity通信的相关内容(如题目o(^▽^)o). Service的非绑定式的创建非常的简单,和启动Activity差不多. 只需要调用startService()即可创建:而调用stopSercice