Android框架揭秘-Android服务概要笔记

Android Framework或应用程序中所需要的主要API都是以系统服务的形式提供的。

例如获取终端的当前位置,读取感应器的数值,拨打电话等。

一、Android服务的种类

    Android系统中有两类服务

    一类是系统服务,由Framework提供

    另一类是应用程序服务,应用程序开发者继承并实现Service类开发出来




二、Android应用程序服务

应用程序服务是Android四大组件的一种, 通过继承Android SDK的Service类实现

可以通过以下两种方式使用这些服务

<1> startService

只是想着后台启动一个执行特定任务的服务


<2>bindService

想通过服务提供的界面实现对服务的控制


三、应用程序服务的分类

应用程序服务分为

Local Service     

创建服务的客户端与服务在同一进程,本地服务只能在创建该服务的应用程序内部使用,

当应用程序终止时,本地服务也一同终止,不论使用哪种方法启动的服务(startService或者bindService)

Remote Service

创建服务的客户端与服务不在同一个进程,客户端要使用服务必须通过IPC机制。

AIDL用于约束两个进程间的通信规则,共编译器生成代码。用来实现Android设备上两个进程间的IPC。



远程服务需要在标签中加入android:process这一属性, 如果未指定该属性, 相关服务将以本地服务的形式存在并运行。

1. 本地服务Local Service


通过Binder getService获取本地服务LocalService的引用。




2. 远程服务RemoteService


ISecondary.aidl -> 编译器生成ISecondary.java


解析

服务端需要继承ISecondary.stub并实现getPid()


ISecondary.Stub.onTransact(){

 ...

case TRANSACTION_getPid:

...

int _result = this.getPid(); //由继承stub的服务子类实现功能

reply.writeInt(_result);

...

...

}



客户端使用ISecondary.Proxy通过这个代理完成与服务端的通信

private static class Proxy implements com.example.android.apis.app.ISecondary{

    private android.os.IBinder mRemote;

    Proxy(android.os.IBinder remote){

        mRemote = remote;//mRemote 保存了引用远程服务的Binder

    }


    public android.os.IBinder asBinder(){

        return mRemote;

    }


    public int getPid{

        ...

        mRemote.transact(Stub.TRANSACTION_getPid, _data, _reply, 0);

        ...

    }

}


四、Android系统服务




1. 系统服务分类

本地系统服务          使用C++编写,运行在Libraries层,主要是AudioFlinger, SerfaceFlinger

JAVA系统服务         如ActivityManagerService   LocationService,  想要使用JAVA系统服务必须使用能够与各服务通信的Local Manager对象。



五、运行系统服务

1.  Android系统启动时,init进程已经启动了这些系统服务,使用系统服务时不需要启动它, 直接调用getSystemService使用即可。

2. 系统服务由MediaServer, SystemServer两个系统进程运行。



3. MediaServer的运行过程


4. SystemServer的运行过程


六、Android Service Framework, Binder Driver概要及相关术语









































你可能感兴趣的:(Android框架揭秘-Android服务概要笔记)