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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章