Android中Settings.System的使用

本文介绍如何利用Android系统设置Settings中的System类实现全局变量的读写操作,并提供了添加自定义全局变量的具体步骤。

如果有留意Android中系统设置Settings里面的源码,你会发现代码中频繁用到了Settings.System操作,该类通过键值对的形式,将一些特定的值以全局的模式保存到Setting的数据库中,我们可以通过它提供的get或者put形式的方法对其中的数据进行读写操作,(非系统级别的应用需要添加对应的权限)。当然,如果能够对frameworks进行修改,我们甚至可以在该类中添加一些特定的值,以方便自己或他人使用。
一、通过Settings.System进行读写
//其中"getXXX"代表对应的类似方法,如getInt()、getBoolean、putString()等。
//通过变量名称获取值,如果变量不存在,数据库中没有设置过初始值或者该值类型不对,将抛出SettingNotFoundException异常
Settings.System.getXXX(ContentResolver cr, String name);
//通过变量名称获取值,如果发生上面方法中导致异常的情况,将返给定的默认值
Settings.System.getXXX(ContentResolver cr, String name, XXX def);
//将指定名称的值写入数据库
Settings.System.putXXX(ContentResolver cr,String name, XXX Value);

非系统权限,需要在App项目的AndroidMainfes.xml文件中添加如下权限:

	<uses-permission android:name="android.permission.READ_SETTINGS" />
	<uses-permission android:name="android.permission.WRITE_SETTINGS" />

二、在Settings.System添加一个自定义的全局变量
Settings.java文件位于frameworks\base\core\java\android\provider下,打开该文件,搜索关键词 SETTINGS_TO_BACKUP ,共有两处,一处是在Settings里面,另一处在内部类Settings.System里面,在SETTINGS_TO_BACKUP数组上面添加自定义变量,同时在该数组里面添加自定义变量名称,Settting和内部类System都需要添加(共四个地方),比如自定义系统变量SYSTEM_ZWH:

 	public static final String SYSTEM_ZWH = "system_zwh";
	Public static final String[] SETTINGS_TO_BACKUP = {
	...
	SYSTEM_ZWH,
	... }

然后,在代码中我们就可以通过对于的get和put方法对该值进行读取和写入操作了。

Android 系统中,`Setting airplane_mode_on` 从 `android.provider.Settings.System` 迁移到 `android.provider.Settings.Global` 后返回只读值,可按以下方式解决: ### 1. 检查 API 级别 由于 `Settings.Global` 仅支持 API 17+,低版本需回退到 `Settings.System`。可通过代码检查当前设备的 API 级别,然后选择合适的设置类: ```java if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { // API 17及以上版本使用 Settings.Global // 读取值 int airplaneMode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0); // 写入值 Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); } else { // API 17以下版本使用 Settings.System // 读取值 int airplaneMode = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0); // 写入值 Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 1); } ``` ### 2. 权限管理 - **动态权限申请**:使用 `Settings.System` 时需遵循 Android 权限模型,避免直接硬编码权限检查。对于 `Settings.Global`,修改时必须是系统签名应用。 ```java // 动态申请权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&!Settings.System.canWrite(context)) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); context.startActivity(intent); } ``` ### 3. 确保应用具有修改权限 - **`Settings.Global`**:修改时必须是系统签名应用。若应用不是系统签名应用,可尝试在 `AndroidManifest.xml` 中声明 `android:sharedUserId="android.uid.system"`,但这需要系统签名。 ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app" android:sharedUserId="android.uid.system"> <!-- 其他配置 --> </manifest> ``` - **`Settings.System`**:需动态申请 `WRITE_SETTINGS` 权限。 ### 4. 数据持久化 `Settings` 组件的数据会实时写入数据库,无需额外处理。若使用 `SystemProperties` 且需持久化,属性名必须以 `persist.` 开头,否则重启后数据会丢失。 ### 5. 避免滥用反射 非系统应用通过反射操作 `SystemProperties` 可能导致兼容性问题,如 Android 版本差异,应避免使用反射操作 `SystemProperties` 来处理飞行模式设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值