可以做的电影网站,展厅设计施工,盘锦网站建设vhkeji,代理自贸区注册公司因为工作中经常需要解决一些framework层的问题#xff0c;而framework层功能一般都是system service 的代理stub#xff0c;然后封装相关接口#xff0c;并提供给APP层使用#xff0c;system service则在不同的进程中运行#xff0c;这样实现了分层#xff0c;隔离#… 因为工作中经常需要解决一些framework层的问题而framework层功能一般都是system service 的代理stub然后封装相关接口并提供给APP层使用system service则在不同的进程中运行这样实现了分层隔离跨进程等需求。 下面以Vibrator为例总结一下实现流程
定义一个抽象类Vibrator定义了应用中可以访问的一些抽象方法frameworks/base/core/java/android/os/Vibrator.java定义具体的类SystemVibrator继承Vibrator实现抽象方法frameworks/base/core/java/android/os/SystemVibrator.java定义一个AIDL接口文件IVibratorService.aidl定义系统服务接口frameworks/base/core/java/android/os/IVibratorService.aidl定义服务VibratorService实现IVibratorService定义的接口frameworks/base/services/java/com/android/server/VibratorService.java
public class VibratorService extends IVibratorService.Stub
5.将VibratorServicey添加到系统服务frameworks/base/services/java/com/android/server/SystemServer.java
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.注册SystemVibrator在ContextImpl里添加SystemVibrator的实例化过程static方法中注册 registerServiceframeworks/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 \
上面的流程在location service和Bluetooth service等流程基本一致也可以参照上面流程实现自定义的系统服务比如车机开发中经常面临这样的需求。