android 系统数据库Settings的使用整理
概述:做系统或者系统应用开发时经常会需要用到跨进程通信,并且需要传递状态值时,可以通过系统数据库的属性进行通信,比如原生系统的设置中的设置休眠时间,usb调试开关等,都是通过Settings.apk中通过选择项设置一个属性值,然后再在framework中的相应模块中通过ContentObserver中的onchange去实现具体的逻辑以达到功能模块的解耦以及跨进程通信的目的,且系统数据库中的值类似于contentprovider,是可以在任何其他应用中随意读取的(有些属性值需要权限),写值的话则需要系统签名才行,并且可以使用ContentObserver监听属性值的变化,不需要像有些场景中需要起个线程去不停的检测某个值的变化,ContentObserver的onchangge只会在数据变化时才有回调
1.系统调用流程
1.1最开始是在frameworks\base\packages\SettingsProvider\res\values\defaults.xml中设置默认值,如
<!-- Default for Settings.Secure.USER_SETUP_COMPLETE -->
<bool name="def_user_setup_complete">false</bool>
1.2后面使用到的字符串是在frameworks\base\core\java\android\provider\Settings.java中定义,如
public static final String USER_SETUP_COMPLETE = "user_setup_complete";
1.3仅在第一次开机或者恢复出厂设置时在\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中分别通过以下方法加入系统数据库中
loadSystemSettings(SQLiteDatabase db)--对应数据库的system表
loadSecureSettings(SQLiteDatabase db)--对应数据库的secure表
loadGlobalSettings(SQLiteDatabase db)--对应数据库的global表
说明:以上方法内部会有几种添加数据类型的方法,如
loadBooleanSetting(stmt, Settings.Global.GUEST_USER_ENABLED,
R.bool.def_guest_user_enabled);//添加boolean类型
loadIntegerSetting(stmt, Global.HEADS_UP_NOTIFICATIONS_ENABLED,
R.integer.def_heads_up_enabled);//添加int类型
loadStringSetting(stmt, Settings.Global.DESK_DOCK_SOUND,
R.string.def_desk_dock_sound);//添加string类型
loadSetting(stmt, Settings.Global.SET_INSTALL_LOCATION, 0);
//最终都会走到这个方法中,都是保存的object类型,拿的时候会去判断类型拿值,再转换为相应的类型的值
private void loadSetting(SQLiteStatement stmt, String key, Object value) {
stmt.bindString(1, key);
stmt.bindString(2, value.toString());
stmt.execute();
}
1.4具体数据库在机器的/data/data/com.android.providers.settings 中,名称为settings.db(实际有后缀名,保存时去掉后缀名保存即可,然后可数据库查看软件查看里面的数值)
2.基本使用
2.1添加自定义的字段到数据库中
\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java中
loadSystemSettings-loadSetting(stmt,"power_save_mode_state", 0);
说明:上面有提到可以在3个方法下面去加,最后结果就是对应到不同的数据库表中,如果不闲麻烦可以参考系统的正规流程,在Settings中去去加字符串,然后默认值通过default.xml去定义,然后参考上面1调用流程中的方法去获得;
2.2读写方法
import android.provider.Settings;
Settings.System.getString(mContext.getContentResolver(), "xxx");
Settings.System.putString(mContext.getContentResolver(),"xxx","defaultStr");
Settings.System.getInt(mContext.getContentResolver(),"power_save_mode_state", 0);
Settings.System.putInt(mContext.getContentResolver(),"power_save_mode_state",1);
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
说明:注意读写方法需要用对应的System/Global/Secure方法,否则读写数据会不对应;如果没在DatabaseHelper.java中添加字段及默认值到数据库中,也是可以正常用put和get方法的,只是数据库表中看不到这个字段而已
2.3状态值改变的监听
import android.database.ContentObserver;
mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor("power_save_mode_state"), false, mXXXObserver);
private ContentObserver mXXXObserver=new ContentObserver(new Handler()) {
public void onChange(boolean selfChange) {
};
};
mContext.getContentResolver().unregisterContentObserver(mXXXObserver);
说明:如果是系统源码里面去加则注意手动导包
android 系统数据库Settings的使用整理相关推荐
- android 系统数据库Settings属性使用及相关介绍
1.用途及作用: alps\frameworks\base\core\java\android\provider\Settings.java Settings下的属性实际分为System,Global ...
- android 查看系统数据库
android的系统数据库在调用的时候都封装了 我们只需要写where的condition,表结构和标明对我们都是不透明的 这就对深入了解带来了很多麻烦,即使有源码查看起来也很费劲. android使 ...
- Android Q:新系统名称和新特性整理
目前关于 Android Q 的相关新闻已经流出,这里我们对 Android Q 的系统名称和新特性进行整理. Android Q 的名字: 很想知道 Android Q 今年使用哪个名字作为系统的名 ...
- sqlite只能用于android系统,Android 数据库的使用 -- Sqlite
Sqlite介绍 SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式系统中. SQLite 数据库是无类型的, ...
- android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用
数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...
- android系统应用之Settings
Setting作为安卓一个比较重要的系统级应用,为用户提供一些系统项的设置.原生android系统的源码路径:/packages/apps/Settings.但MTK厂商的源码包中对该应用进行了重构其 ...
- Android系统Settings添加语言
平台:RK3288 Android9.0 需求:系统Settings语言选项默认添加韩语.英语. final Locale locale1 = new Locale("ko",&q ...
- android 系统短信数据库的查询与删除
对系统短信数据库进行操作 首先,需要如下权限 <uses-permission android:name="android.permission.READ_SMS" /> ...
- android 串口调试adb,Android系统 debug 技巧(最全最强adb 串口调试命令)
串口调试命令 debug adb 命令(去掉adb shell即为串口命令) 发送广播 adb shell am broadcast -a com.android.test 打开activity ad ...
最新文章
- rtmp Chunk stream ID 说明
- 【全栈项目上线(vue+node+mongodb)】04. 怎么在一台主机上面部署多个网站,详细操作指南...
- endl在c语言中的作用,C++中的endl
- 用Xamarin 实现园友的 :Android浮动小球与开机自启动
- python numpy中arange()和linspace()区别
- 1771: 书架整理(dp)
- c语言创建学生成绩表,C语言创建信息链表,求助
- Atlas Unknown Error
- C++异常处理(一) - iStack
- Mac小白入门小技巧
- MySql:Unknown collation: ‘utf8mb4_0900_ai_ci‘
- 190515每日一句
- 优化器,sgd,adam等
- C语言小案例_OA大典故障案例摘录【第1400篇】理光2501载体初始化
- android addr2line使用
- 上传iOS应用时 ERROR ITMS-90096: Your binary is not optimized for iPhone 5。。。
- 十大靠谱“计算机视觉数据集”榜单
- 2018计算机专硕学硕,2018考生快上车!专硕VS学硕,究竟怎么选?
- 没有人比我更懂集群调度器---之流行集群调度器综述
- mysql和firebird的性能_Access和Firebird的性能比较
热门文章
- tracer静态和缺省路由配置_Ciso Packet Tracer配置静态路由及默认路由(一)
- 虚幻4-初识蓝图“设置操控器移动“
- 嵌入式LinuxAndroid开发-SDK下载编译
- 蓝桥杯-2020-Java-B组-装饰珠-动态规划
- java实现串的反转
- GitHub Desktop使用说明(2)快捷键
- 软文推广最终目的是什么?
- 机器学习-周志华-支持向量机的逻辑详解
- 狂神学JAVA--基础篇:JavaSE Xmind总结 思维导图
- 【愚公系列】2021年12月 攻防世界-简单题-REVERSE-001(Hello, CTF)