一个简单的SystemService(vibrator)


Android 6.0
1:应用怎么使用vibrator
    Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);    //获取Vibrator实例
    mVibrator.vibrate(500);
    frameworks/base/core/java/android/app/SystemServiceRegistry.java
    
                public static Object getSystemService(ContextImpl ctx, String name) {
                ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
                return fetcher != null ? fetcher.getService(ctx) : null;

                }  //获取Vibrator
                SYSTEM_SERVICE_FETCHERS是一个HashMap,通过我们服务的名字name字符串,从这个HashMap里取出一个ServiceFetcher,
                再return这个ServiceFetcher的getService()。ServiceFetcher是什么?它的getService()又是什么?
                既然他是从SYSTEM_SERVICE_FETCHERS这个HashMap里get出来的,那就找一找这个HashMap都put了什么。 
                通过搜索SystemServiceRegistry可以找到如下代码:

                private static <T> void registerService(String serviceName, Class<T> serviceClass,
                    ServiceFetcher<T> serviceFetcher) {
                SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
                SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher); 
                }
                调用
                final class SystemServiceRegistry {
                registerService(Context.VIBRATOR_SERVICE, Vibrator.class, //使用private static <T> void registerService
                    new CachedServiceFetcher<Vibrator>() {
                @Override
                public Vibrator createService(ContextImpl ctx) {
                    return new SystemVibrator(ctx);
                }};
                } //注册

    
    分析 一:  frameworks/base/core/java/android/os/Vibrator.java //Vibrator只是定义在android.os 包里的一个抽象类 
         public abstract class Vibrator{
            abstract void cancel() 取消振动
            abstract boolean hasVibrator() 是否有振动功能
            abstract void vibrate(long[] pattern, int repeat) 按节奏重复振动
            abstract void vibrate(long milliseconds) 持续振动
         }
        方法在./frameworks/base/core/java/android/os/SystemVibrator.java中实现
        public class SystemVibrator extends Vibrator {
             private final IVibratorService mService;  //IVibratorService在 frameworks/base/core/java/android/os/IVibratorService.aidl 实现
                
                public SystemVibrator(Context context) {
                    super(context);
                    mService = IVibratorService.Stub.asInterface(    //接口,
                    ServiceManager.getService("vibrator"));
                }
                
                
                public boolean hasVibrator() {                    //实现 方法
                    return mService.hasVibrator();                //调用接口    
                }
        }
    二:        IVibratorService在 frameworks/base/core/java/android/os/IVibratorService.aidl //接口定义,
                interface IVibratorService
                {
                    boolean hasVibrator();
                    void vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token);
                    void vibratePattern(int uid, String opPkg, in long[] pattern, int repeat, int usageHint, IBinder token);
                    void cancelVibrate(IBinder token);
                }
            接口定实现在./frameworks/base/services/core/java/com/android/server/VibratorService.java

            JNI  ./frameworks/base/services/core/jni/com_android_server_VibratorService.cpp 
                public class VibratorService extends IVibratorService.Stub
                        implements InputManager.InputDeviceListener {
                            
                            
                }
                可以看到 VibratorService实现了IVibratorService定义的所有接口,并通过JNI调用到native层,进行更底层的实现

   三:VibratorService 是怎么成为系统服务的
       frameworks/base/services/java/com/android/server/SystemServer.java
        VibratorService vibrator = null;
        vibrator = new VibratorService(context);   //实例化VibratorService并添加到ServiceManager
        ServiceManager.addService("vibrator", vibrator);

            try {
                 vibrator.systemReady();  ////通知服务系统启动完成
             } catch (Throwable e) {
                 reportWtf("making Vibrator Service ready", e);
             }
   
mService 相当于IVibratorService在应用层的一个代理,所有的实现还是在SystemServer的VibratorService里。 
看代码时可以发现registerService是在static代码块里静态调用的,所以getSystemServcr获得的各个Manager也都是单例的    
            
从上面的分析,我们可以总结出Vibrator服务的整个实现流程:

1:定义一个抽象类Vibrator,定义了应用中可以访问的一些抽象方法 
    frameworks/base/core/java/android/os/Vibrator.java
    定义具体的类SystemVibrator继承Vibrator,实现抽象方法 
    frameworks/base/core/java/android/os/SystemVibrator.java
2:定义一个AIDL接口文件IVibratorService,定义系统服务接口 
    frameworks/base/core/java/android/os/IVibratorService.aidl
    定义服务VibratorService,实现IVibratorService定义的接口 
    ./frameworks/base/services/core/java/com/android/server/VibratorService.java
     public class VibratorService extends IVibratorService.Stub
3: 将VibratorServicey添加到系统服务 
    frameworks/base/services/java/com/android/server/SystemServer.java
    VibratorService vibrator = null;
    vibrator = new VibratorService(context);   //实例化VibratorService并添加到ServiceManager
    ServiceManager.addService("vibrator", vibrator);

        try {
             vibrator.systemReady();  ////通知服务系统启动完成
         } catch (Throwable e) {
             reportWtf("making Vibrator Service ready", e);
         }

4:在SystemVibrator中通过IVibratorService的代理连接到VibratorService,这样SystemVibrator的接口实现里就可以调用IVibratorService的接口: 
    frameworks/base/core/java/android/os/SystemVibrator.java

        public class SystemVibrator extends Vibrator {
                private final IVibratorService mService; 
                
                public SystemVibrator(Context context) {
                    super(context);
                    mService = IVibratorService.Stub.asInterface(    
                    ServiceManager.getService("vibrator"));
                }
                
                
                public boolean hasVibrator() {                    
                    return mService.hasVibrator();                
                }
        }

5:在Context里定义一个代表Vibrator服务的字符串 
    frameworks/base/core/java/android/content/Context.java
    public abstract class Context {
    
     public static final String VIBRATOR_SERVICE = "vibrator";
    }
    frameworks/base/core/java/android/app/SystemServiceRegistry.java  //添加SystemVibrator的实例化过程 
    
        final class SystemServiceRegistry {
        registerService(Context.VIBRATOR_SERVICE, Vibrator.class,
            new CachedServiceFetcher<Vibrator>() {
        @Override
        public Vibrator createService(ContextImpl ctx) {
            return new SystemVibrator(ctx);
        }});
         }
6 在应用中使用Vibrator的接口

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

//目前是2个问题,一个是要注册系统服务了    VibratorService  为什么还要在SystemServiceRegistry.java中实例化
 

猜你喜欢

转载自blog.csdn.net/alifrank/article/details/81739144