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中实例化