背景:
很多学员朋友在刚开始做纯第三方app开发时候都很少接触Setting值,因为一般第三方应用没有对Setting相关权限。只有系统签名相关应用才可以有,所以经常在开始做一些需求开发的时候很容易走弯路。
比如有如下一个场景
经常会有系统应用和其他系统应用进行一些简单的数据通讯,比如传递个数字,字符,开关等简单数据通讯。这个情况下大家会选着什么方式来进行这个数据传递呢?难道是binder?新定义相关的aidl接口?
是不是感觉好麻烦,就是为了传递通知个数值功能,怎么还要写相关aidl接口,每个进程还需要程序依赖编译。。。
其实系统中本身有一个Settings值的类就可以很好帮助大家解决上面的通讯问题,根本不需要写啥binder,aidl接口等
所以大家记住了,简单的字符,数据,开关等获取,监听等需求,完全是不需要跨进程aidl接口的,只要用Settings类完全可以。
具体实战:
举个场景例子,系统应用app需要传递一个value给systemserver,systemserver需要监听到这个value的变化后进行相关业务处理。这个需求很常见吧,比如在systemserver做个功能,这个功能需要由具体某个系统应用的开关开启。
上面应该是再正常不过需求啦。
具体代码部分
客户端部分:
直接调用Settings.Global.putInt既可以写入一个Settings值
Settings.Global.putInt(getContentResolver(),"testValue",mCount++);
Settings.Global中的Global代表是不同组,主要有以下3个
当然这个是需要有下面权限才可以,第三方应用调用立即报错:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.projectionclient/com.example.projectionclient.MainActivity}: java.lang.SecurityException: Permission denial, must have one of: [android.permission.WRITE_SECURE_SETTINGS]
当然也可以不写入代码,可以 使用settings的相关命令:
adb shell settings put global testValue 2
systemserver端:
因为要实现可以监听变化,所以这个不能仅仅获取
参考源码地址:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
中的SettingsObserver
监听value变化代码
构建好相关uri
private final Uri testUri = Settings.Global.getUriFor(
"testValue");
注册监听
resolver.registerContentObserver(testUri, false, this,
UserHandle.USER_ALL);
public void onChange(boolean selfChange, Uri uri) {
if (testUri.equals(uri)) {
//Settings.Global.getInt获取Settings的testValue方法
int value = Settings.Global.getInt(mContext.getContentResolver(),
"testValue", -1);
Log.i("lsm88888","SettingsObserver in wms " + uri + " value " + value);
}
}
上面就是systemserver的wms监听这系统app设置来的testValue数值变化。
测试结果:
在app中触摸后触发put,然后systemserver的wms中监听打印了如下值
这样在wms中就可以根据这个变化来改变系统的业务逻辑,同样系统app直接也是一样的监听方式和读取方式
总结:
做系统应用,系统框架开发,这种简单数据类型的值传递,完全可以使用Settings值方式,完全不需要使用麻烦的binder,aidl方式,这个Settings可以大大减轻各个进程通讯的耦合程度,减少代码上的依赖关系。一定要掌握这个Settings的灵活使用
本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
获取优惠下面公众号联系
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw