以添加控制LED的服务为例子简述 android 系统服务的编写。

##分析

首先需要知道的是android 之所以能够提供系统服务,是因为进程间通信,系统服务一直在后台运行。当程序想使用这些服务的时候,只要申请使用就可以了。android使用自己的Binder实现了这种进程间通行。

我想实现一个控制LED的系统服务,但是不需要过度了解 Binder, 只需要在系统服务的框架中添加相应的代码就可以了。

structure

##实现

###定义接口

aidl文件定义了服务端提供的接口

:::java
//ILEDManager.aidl
package android.app;

interface ILEDManager {
    void setWifiLED(boolean flag);
    void setApLED(boolean flag);
}

定义好好需要在编译文件添加文件。

:::java
//Android.mk
    core/java/android/app/ILEDManager.aidl \

###接口实现代码

定义了接口后,就需要实现服务端逻辑了。

:::java
//LEDManagerService.java
package com.android.server;

import android.util.Slog;
import android.os.IBinder;
import android.os.Binder;
import android.content.Context;

import android.app.LEDManager;
import android.app.ILEDManager;

public class LEDManagerService extends ILEDManager.Stub{
    private static final String TAG = "LEDManagerService";

    private LightsService mLightsService;
    private Context mContext;
    private final LightsService.Light mWifiLight;
    private final LightsService.Light mApLight;

    public LEDManagerService(Context context, LightsService lights){
        this.mContext = context;
        this.mLightsService = lights;
        mWifiLight = mLightsService.getLight(LightsService.LIGHT_ID_WIFI);
        mApLight = mLightsService.getLight(LightsService.LIGHT_ID_AP);
    }


    public void setWifiLED(boolean flag){
        if(mWifiLight != null){
            if(flag){
                mWifiLight.setColor(1);
            }else{
                mWifiLight.turnOff();
            }
        }
    }

    public void setApLED(boolean flag){
        if(mApLight != null){
            if(flag){
                mApLight.setColor(1);
            }else{
                mApLight.turnOff();
            }
        }

    }

}

###加载

服务端的代码实现了,但是还需要在系统启动的时候启动服务,所以需要加上下面代码。

:::java
//SystemServer.java
try{
    Slog.i(TAG, "LEDManager Service");
    led = new LEDManagerService(context, lights);
    ServiceManager.addService("led", led);
} catch (Throwable e){
    reportWtf("starting LED service",e);
}

###客户端实现

:::java
//LEDManager.java
package android.app;

import android.os.RemoteException;

public class LEDManager
{

    private final ILEDManager mService;
    LEDManager (ILEDManager mService){
        mService = service;
    }

    public void setWifiLED(boolean flag){
        try {
            mService.setWifiLED(flag);
        } catch (RemoteException ex) {
        }
    }

    public void setApLED(boolean flag){
        try {
            mService.setApLED(flag);
        } catch (RemoteException ex) {
        }
    }
}
:::java
//ContexImpl.java
registerService("led", new StaticServiceFetcher(){
        public Object createStaticService(){
        IBinder b = ServiceManager.getService("led");
        ILEDManager service = ILEDManager.Stub.asInterface(b);
        return new LEDManager(service);
        }
        });

只要加上了服务端的接口,我们就可以很方便的使用系统服务了。

:::java
LEDManager lm = (LEDManader) getSystemService("led");
lm.setWifiLED(true);