一个System Service实现流程

2019-12-29  本文已影响0人  力卉编程

一个System Service实现流程

从上面的分析,我们可以总结出Vibrator服务的整个实现流程:

1、定义一个抽象类Vibrator,定义了应用中可以访问的一些抽象方法
frameworks/base/core/java/android/os/Vibrator.java
2、定义具体的类SystemVibrator继承Vibrator,实现抽象方法
frameworks/base/core/java/android/os/SystemVibrator.java
3、定义一个AIDL接口文件IVibratorService,定义系统服务接口
frameworks/base/core/java/android/os/IVibratorService.aidl
4、定义服务VibratorService,实现IVibratorService定义的接口

frameworks/base/services/java/com/android/server/VibratorService.java
public class VibratorService extends IVibratorService.Stub

5、将VibratorServicey添加到系统服务


VibratorService vibrator = null;
...
//实例化VibratorService并添加到ServiceManager
Slog.i(TAG, "Vibrator Service");
vibrator = new VibratorService(context);
ServiceManager.addService("vibrator", vibrator);
...
//通知服务系统启动完成
try {
    vibrator.systemReady();
} catch (Throwable e) {
    reportWtf("making Vibrator Service ready", e);
}

6、在SystemVibrator中通过IVibratorService的代理连接到VibratorService,这样SystemVibrator的接口实现里就可以调用IVibratorService的接口:

//frameworks/base/core/java/android/os/SystemVibrator.java
private final IVibratorService mService;
...
public SystemVibrator() {
    ...
    mService = IVibratorService.Stub.asInterface(
            ServiceManager.getService("vibrator"));
    ...
    public boolean hasVibrator() {
        ...
        try {
            return mService.hasVibrator();
        } catch (RemoteException e) {
        }
        ...
    }
}

7、在Context里定义一个代表Vibrator服务的字符串

//frameworks/base/core/java/android/content/Context.java
public static final String VIBRATOR_SERVICE = "vibrator";

8、在ContextImpl里添加SystemVibrator的实例化过程

//frameworks/base/core/java/android/app/ContextImpl.java
registerService(VIBRATOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
    return new SystemVibrator(ctx);
}});  

9、在应用中使用Vibrator的接口

Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
mVibrator.vibrate(500);

10、为保证编译正常,还需要将AIDL文件添加到编译配置里

//frameworks/base/Android.mk
LOCAL_SRC_FILES += \
...
core/java/android/os/IVibratorService.aidl \

完~~
文 | 力卉编程

上一篇下一篇

猜你喜欢

热点阅读