概述:做系统或者系统应用开发时经常会需要用到跨进程通信,并且需要传递状态值时,可以通过系统数据库的属性进行通信,比如原生系统的设置中的设置休眠时间,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的使用整理相关推荐

  1. android 系统数据库Settings属性使用及相关介绍

    1.用途及作用: alps\frameworks\base\core\java\android\provider\Settings.java Settings下的属性实际分为System,Global ...

  2. android 查看系统数据库

    android的系统数据库在调用的时候都封装了 我们只需要写where的condition,表结构和标明对我们都是不透明的 这就对深入了解带来了很多麻烦,即使有源码查看起来也很费劲. android使 ...

  3. Android Q:新系统名称和新特性整理

    目前关于 Android Q 的相关新闻已经流出,这里我们对 Android Q 的系统名称和新特性进行整理. Android Q 的名字: 很想知道 Android Q 今年使用哪个名字作为系统的名 ...

  4. sqlite只能用于android系统,Android 数据库的使用 -- Sqlite

    Sqlite介绍 SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式系统中. SQLite 数据库是无类型的, ...

  5. android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用

    数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...

  6. android系统应用之Settings

    Setting作为安卓一个比较重要的系统级应用,为用户提供一些系统项的设置.原生android系统的源码路径:/packages/apps/Settings.但MTK厂商的源码包中对该应用进行了重构其 ...

  7. Android系统Settings添加语言

    平台:RK3288 Android9.0 需求:系统Settings语言选项默认添加韩语.英语. final Locale locale1 = new Locale("ko",&q ...

  8. android 系统短信数据库的查询与删除

    对系统短信数据库进行操作 首先,需要如下权限 <uses-permission android:name="android.permission.READ_SMS" /> ...

  9. android 串口调试adb,Android系统 debug 技巧(最全最强adb 串口调试命令)

    串口调试命令 debug adb 命令(去掉adb shell即为串口命令) 发送广播 adb shell am broadcast -a com.android.test 打开activity ad ...

最新文章

  1. rtmp Chunk stream ID 说明
  2. 【全栈项目上线(vue+node+mongodb)】04. 怎么在一台主机上面部署多个网站,详细操作指南...
  3. endl在c语言中的作用,C++中的endl
  4. 用Xamarin 实现园友的 :Android浮动小球与开机自启动
  5. python numpy中arange()和linspace()区别
  6. 1771: 书架整理(dp)
  7. c语言创建学生成绩表,C语言创建信息链表,求助
  8. Atlas Unknown Error
  9. C++异常处理(一) - iStack
  10. Mac小白入门小技巧
  11. MySql:Unknown collation: ‘utf8mb4_0900_ai_ci‘
  12. 190515每日一句
  13. 优化器,sgd,adam等
  14. C语言小案例_OA大典故障案例摘录【第1400篇】理光2501载体初始化
  15. android addr2line使用
  16. 上传iOS应用时 ERROR ITMS-90096: Your binary is not optimized for iPhone 5。。。
  17. 十大靠谱“计算机视觉数据集”榜单
  18. 2018计算机专硕学硕,2018考生快上车!专硕VS学硕,究竟怎么选?
  19. 没有人比我更懂集群调度器---之流行集群调度器综述
  20. mysql和firebird的性能_Access和Firebird的性能比较

热门文章

  1. tracer静态和缺省路由配置_Ciso Packet Tracer配置静态路由及默认路由(一)
  2. 虚幻4-初识蓝图“设置操控器移动“
  3. 嵌入式LinuxAndroid开发-SDK下载编译
  4. 蓝桥杯-2020-Java-B组-装饰珠-动态规划
  5. java实现串的反转
  6. GitHub Desktop使用说明(2)快捷键
  7. 软文推广最终目的是什么?
  8. 机器学习-周志华-支持向量机的逻辑详解
  9. 狂神学JAVA--基础篇:JavaSE Xmind总结 思维导图
  10. 【愚公系列】2021年12月 攻防世界-简单题-REVERSE-001(Hello, CTF)