如何实现一个 System Services?,2020年android面试题

本文详细讲解如何在Android中实现一个系统服务,从编写AIDL文件开始,逐步介绍Context定义、服务编写、注册服务、Manager类创建、错误处理等步骤。通过实例展示了WuXiaolongManagerService的创建过程,包括其在SystemServer中的启动和注册。同时,文中提到了在实际操作中可能遇到的编译错误及其解决方案。
摘要由CSDN通过智能技术生成

IDisplayManager 只是接口,需要找下哪里实现了它,搜索是在 BinderService,BinderService 是 DisplayManagerService 内部类。

final class BinderService extends IDisplayManager.Stub {
@Override // Binder call
public void setTemporaryBrightness(float brightness) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS,
“Permission required to set the display’s brightness”);
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
mDisplayPowerController.setTemporaryBrightness(brightness);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
}

mDisplayPowerController.setTemporaryBrightness(brightness)后面经过一系列调用会到 LightsService#setLight_native,通过 JNI 调用到 native 层,调用底层进行背光调节,关于背光调节后面文章再细讲。

SystemServer

DisplayManagerService 是继承了 SystemService,DisplayManagerService 是怎么注册为系统服务的呢?在 SystemServer 里面:

private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin(“StartDisplayManager”);
//开启DisplayManagerService
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
t.traceEnd();
}
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
//通知服务系统启动完成
t.traceBegin(“MakeDisplayManagerServiceReady”);
try {
// TODO: us
e boot phase and communicate these flags some other way
mDisplayManagerService.systemReady(safeMode, mOnlyCore);
} catch (Throwable e) {
reportWtf(“making Display Manager Service ready”, e);
}
t.traceEnd();
}

看完 DisplayManagerService 是怎么写的,不妨模仿写个。 所谓看着代码,感觉还是挺简单的,实际操作起来,各种编译报错……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值