一个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 \
完~~
文 | 力卉编程
网友评论