如果有留意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 = {
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");
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類里