美文网首页
一个System Service实现流程

一个System Service实现流程

作者: 力卉编程 | 来源:发表于2019-12-29 10:59 被阅读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 \
    
    

    完~~
    文 | 力卉编程

    相关文章

      网友评论

          本文标题:一个System Service实现流程

          本文链接:https://www.haomeiwen.com/subject/uqlyoctx.html