如果有留意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添加一个自定义的全局变量

frameworks\base\core\java\android\provider\Settings.Java下,打开该文件,搜索关键词 SETTINGS_TO_BACKUP ,共有两处,

一处是在Settings里面,另一处在内部类Settings.System里面,在SETTINGS_TO_BACKUP数组上面添加自 定义变量,同时在该数组里面添加自定义变量名称,

Settting和内部类System都需要添加(共四个地方),比如自定义系统变量 SYSTEM_ZWH:

三、如何使用全局变量

a:定义变量

frameworks/base/core/java/android/provider/Settings.java

   /**
    * mobile model             
    * @hide
    */
    public static final String MOBILE_MODEL="mobile_model";

/**
         * Settings to backup. This is here so that it's in the same place as the settings
         * keys and easy to update.
         *
         * NOTE: Settings are backed up and restored in the order they appear
         *       in this array. If you have one setting depending on another,
         *       make sure that they are ordered appropriately.
         *
         * @hide
         */
        public static final String[] SETTINGS_TO_BACKUP = {

     MOBILE_MODEL,  //mobile model 
 
b:初始化变量
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadSetting(stmt, Settings.System.MOBILE_MODEL, VERSION.RELEASE); 
VERSION.RELEASE:
frameworks/base/core/java/android/os/Build.java
    /** Various version strings. */
    public static class VERSION {
 
    /**
     * The user-visible version string.  E.g., "1.0" or "3.4b5".
     */
     public static final String RELEASE = getString("ro.build.version.release");
 
c:使用全局变量赋值
packages/apps/Settings/src/com/android/settings/DeviceInfoSettings.java
Settings.System.putString(this.getContentResolver(), Settings.System.MOBILE_MODEL, "4.4");
 
d:使用全局变量获取值
packages/apps/Select/src/com/mtk/select/selectActivity.java
EditText sysEdit = (EditText) findViewById(R.id.system_name_edit);
sysEdit.setText(Settings.System.getString(this.getContentResolver(),
        Settings.System.MOBILE_MODEL));//mobile model
 
 
 
 
 

Android保存数据到系统数据库中:Settings.System


有时候我们一些设置属性要保存到本地,防止软件卸载后配置属性消失。

比如我今天就有个修改手机蓝牙名称显示的功能,但是只需要修改一次,并且进行标记,并保存这个标识,如果程序卸载,重新安装也不需要再修改,这里就是要保存这个标识,来判断是否需要修改名称。
要实现这个功能,SharePreference是不行的了,本地文件file保存呢,是可以的,但是比较麻烦,而且有被删掉的可能。
这里介绍一个比较简单、实用的方法:
这个方法就是把标识保存到系统配置(系统数据库)文件中,即使程序卸载也不影响,系统的配置文件。
代码示例:

import android.provider.Settings;
import android.util.Log;
import android.content.Context;

//设置系统配置文件中的数据,第一个参数固定的,但是需要上下文,第二个参数是保存的Key,第三个参数是保存的value
boolean changeBluetoothName = Settings.System.putInt(getContentResolver(), "changeBluetoothName", 1);

//获取系统配置文件中的数据,第一个参数固定的,但是需要上下文,第二个参数是之前保存的Key,第三个参数表示如果没有这个key的情况的默认值
int blueFlag = Settings.System.getInt(getContentResolver(), "changeBluetoothName", 0);

这里的保存数据类似SharePreference,保存的是键值对key-value,但是这里的数据是保存到系统文件中的,跟程序无关,但是在程序中是可以能够获取的。
上面示例代码保存的是int数据,也可以使用putString保存String数据,putByte保存byte数据等等。。。
同样的,获取也是根据保存的数据类型来获取。

运行前还要添加一个权限,否则会报错
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

据说这个系统配置文件的位置是:
/data/data/com.android.providers.settings/databases/

数据库控制的代码:
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings的DatabaseHelper类里

MTK Android Android数据保存到系统数据库的更多相关文章

  1. pandas数据保存至Mysql数据库

    pandas数据保存至Mysql数据库 import pandas as pd from sqlalchemy import create_engine host = '127.0.0.1' port ...

  2. Android少量数据保存之SharedPreferences接口实例

    SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...

  3. Android开发----使用 Room 将数据保存到本地数据库

    Room介绍以及不使用SQLite的原因 Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库. 处理大量结构化数据的应用可极大地受益于 ...

  4. Android吧数据保存成xml文件

    public class MainActivity extends Activity { private List<Person> persons; @Override protected ...

  5. 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)

    一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...

  6. 课堂测试用javaweb写一个注册界面,并将数据保存到后台数据库(部分完成)

    今天我到现在为止,也只完成了数据库的连接,还没有写前台的javascript的检查输入的代码,打算周四前完成. 代码如下: package Dao; import java.sql.Connectio ...

  7. Android中的数据保存

    形式 Android的数据保存分为3种形式:file, SharedPreference, Database 文件 主要思想就是通过Context类中提供的openFileInput和openFile ...

  8. Android数据保存之SharedPreference

    前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的.保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器.总之大部分的程序 ...

  9. Android 之数据存储(sdCard,sharedPreference,sqlite数据库)

    sdCard:默认路径在 /storage/sdcard/... Android支持OpenFileOutput和openFileInput方式访问手机存储器上的文件. Context提供了如下两个方 ...

随机推荐

  1. Ubuntu16.04 desktop 设置共享文件夹 -- 图形界面配置

    1. 安装 安装samba 直接采用 Ubuntu16.04 desktop 里面的安装向导来完成: 选中需要共享的文件夹 -> 右键 “local Network Share” -> 安 ...

  2. C++ 函数模板/类模板

    #include <iostream> #include <vector> using namespace std; template < class T > // ...

  3. MVC超链接调用控制器内的方法

    <a href="hello/Layout?name=Tom"><h1><span>Hello</span>World</h1 ...

  4. 我的Keras使用总结(2)——构建图像分类模型(针对小数据集)

    Keras基本的使用都已经清楚了,那么这篇主要学习如何使用Keras进行训练模型,训练训练,主要就是“练”,所以多做几个案例就知道怎么做了. 在本文中,我们将提供一些面向小数据集(几百张到几千张图片) ...

  5. AAAI 2020 | 反向R?削弱显著特征为细粒度分类带来提升

    论文提出了类似于dropout作用的diversification block,通过抑制特征图的高响应区域来反向提高模型的特征提取能力,在损失函数方面,提出专注于top-k类别的gradient-bo ...

  6. word2vec 和 glove 模型的区别

    2019-09-09 15:36:13 问题描述:word2vec 和 glove 这两个生成 word embedding 的算法有什么区别. 问题求解: GloVe (global vectors ...

  7. 李宏毅老师机器学习课程笔记_ML Lecture 0-2: Why we need to learn machine learning?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  8. 控制台报错Cause: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 78; 元素类型 "select" 必须后跟属性规范 ">" 或 "/>"

    首先我的控制台报错是这样的,我找了一下原因看到是第四行的错误: 它说元素select后面必须跟属性规范">""/>"但是我把我眼睛都快丑瞎了都没发现 ...

  9. C#获取设备话筒主峰值(实时音频输出分贝量)

    1.引用类库NAudio,Git地址 https://github.com/naudio/NAudio 2.添加如下代码和引用: public float GetVoicePeakValue() { ...

  10. VMware workstation 下Hadoop伪分布式模式安装

    详细过程: 1.VMware安装: 2.centos 6 安装 3.jdk下载安装配置 4.Hadoop 安装配置 1.VMware Workstation 安装: https://www.vmwar ...