安卓系统应用框架framework开发必须要会的Settings值传递接受数据

背景:

很多学员朋友在刚开始做纯第三方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

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值