Settings數據庫的讀取和監聽

我們還是先來了解一下settings.db數據庫中system表存放的是什麼。

從字面意思我們就可以看出,settings.system爲系統數據庫,裏面存放的數據大多爲系統的一些配置數據,包括還有一些應用存放的其他數據信息。

用Settings來保存數據簡單易用,app把數據保存到Settings的數據庫裏面,在另外一個app訪問該數據庫的數據,到達應用共享數據的效果

你也可以在項目中把自己的數據存放在系統數據庫內,這樣就可以達到數據永久存放的目的,即使你的應用被卸載了,這些數據依然不會被刪除。

設置數據的方法如下:

Settings.System.putInt(getContentResolver(),"navi_widget_style",1);

特別注意:寫setting數據庫需要對應的權限,6.0以下可以清單文件註冊,6.0以上動態申請都不行,必須獲取系統級的權限

大多數我們採用Settings.System類中的get方法來獲取相對應Key下的數據,具體的代碼如下:

Settings.System.getInt(getContentResolver(),"navi_widget_style");

例如這裏我獲取的是name值爲:“navi_widget_style” 下的數據。如果你想獲取的是你自己自定義的數據,那麼這裏的name參數就寫你設置的name值。

在項目中的使用:換膚設置setting數據,白天黑夜模式的監聽

有時候,我們不止需要獲取一下數據就可以了,我們還需要對數據進行改變監聽,每當數據有變化時,就做出相應的改變,比如我們項目中需要根據白天黑夜進行相應的ui變化,而白天黑夜的設置是另一款應用寫在setting裏,所以我們就需要監聽setting的變化,做出相應

監聽的代碼:

public class SettingsValueChangeContentObserver extends ContentObserver {
    private static final String TAG = "SettingsValueChangeContentObserver";
    private MainActivity mMainActivity;

	//構造函數,可以傳遞一個Handler,其實默認就是接受Handler,這裏圖省事,直接傳遞Activity過來了
    public SettingsValueChangeContentObserver(MainActivity mainActivity) {
        super(new Handler());
        mMainActivity = mainActivity;
    }

	//每當數據變化時,就會回調這個方法,進行獲取值,然後操作
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        try {
        	//獲取數據庫中的值,然後處理
            int mode = Settings.System.getInt(mMainActivity.getContentResolver(),"navi_widget_style");
            Log.i(TAG, "onChange:::" + mode);
            mMainActivity.setThemeType(mode);
        } catch (Exception e) {
            Log.e(TAG,e.getLocalizedMessage());
            e.printStackTrace();
        }
    }
}

下來是Activity中的設置和銷燬監聽:

public class MainActivity extends BaseActivity{
	private SettingsValueChangeContentObserver mSettingsValueChangeContentObserver;
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSettingValueChangeObserver();
    }
    
    //註冊監聽
	private void initSettingValueChangeObserver() {
	        mSettingsValueChangeContentObserver = new SettingsValueChangeContentObserver(this);
	        getContentResolver().registerContentObserver(Settings.System.getUriFor("navi_widget_style"
	        	, true, mSettingsValueChangeContentObserver);
	 }

	//銷燬監聽
	@Override
    protected void onDestroy() {
        super.onDestroy();
        getContentResolver().unregisterContentObserver(mSettingsValueChangeContentObserver);
    }

	//進行ui的處理,當然可以使用Handler的方式處理
	public void setThemeType(int mode) {
        mTopRightView.setThemeType(mode);
    }
}

這樣就完成了對setting數據庫的監聽

Setting數據庫存儲了很多系統有用的數據,比如藍牙的狀態,網絡的狀態等等,實用性很強

小知識點:
使用adb可以獲取setting數據庫的值,可以get也可以put值
使用描述

adb shell settings get system(有三個值可以選擇,一般是system) navi_widget_style(這個是系統的key或者自定義的key)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章