Android 使用Settings 数据库demo(附源码)
一、android系统很多设置的数据都保存在settings数据库里面,例如音量大小、休眠时间、屏幕亮度等。
二、adb查看和写settings数据库里面的值。
2. 1 安全性的用户偏好系统设置,第三方APP有读没有写的权限
secure
Settings.Secure
content://settings/secure
2. 2 所有的编号设置,对系统的所有用户公开,第三方APP有读没有写的权限
global
Settings.Global
content://settings/global
3.3 包含各种各样的用户偏好系统设置
system
Settings.system
content://settings/system
三、实例学习,demo的功能一是向setting数据库某个key写value,然后读出来。功能二是侦听settings数据库里面某个key的value,如果改变会有提醒。
3.1 settingdatebasedemo\app\src\main\java\com\example\settingdatebasedemo\MainActivity.java
package com.example.settingdatebasedemo;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_time;
private int i=0;
private static String TAG="settingdatebasedemo";
ChangeContentObserver mChangeContentObserver = null;
ChangeSContentObserver mChangeSContentObserver = null;
// 如果第三方应用是写不到Setting 数据库的,必须需要系统权限
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_time = (TextView) findViewById(R.id.itext);
mChangeContentObserver = new ChangeContentObserver();
mChangeSContentObserver= new ChangeSContentObserver();
getContentResolver().registerContentObserver(Settings.Global.getUriFor("global_test"), true, mChangeContentObserver);
getContentResolver().registerContentObserver(Settings.System.getUriFor("volume_ring_speaker"), true, mChangeSContentObserver);
} public void write_settings_database(View v)
{
i+=6;
SetGlobalData(this.getApplicationContext(),"global_test", i);
//getContentResolver().notifyChange(Settings.Global.getUriFor("haiyue"),null);
//这个方法也是要在有上下文的地方执行,一般是在自定义的Provider中执行,第一个是url对象,第二个参数是null
//getContext().getContentResolver().notifyChange(URI,null);
//数据进行增删查成功后,都执行一下上面这个方法即可。
tv_time.setText(String.valueOf(GetGlobalData(this.getApplicationContext(),"global_test")));
}
class ChangeSContentObserver extends ContentObserver {
public ChangeSContentObserver (Handler handler) {
super(handler);
}
public ChangeSContentObserver () {
// TODO Auto-generated constructor stub
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Toast.makeText(MainActivity.this,"i:volume_ring_speaker value has changed!", Toast.LENGTH_LONG).show();
Log.d(TAG, "ChangeSContentObserver -->volume_ring_speaker value changed(" + selfChange + ") ");
}
} /*
* 监听值变化
*/
class ChangeContentObserver extends ContentObserver {
public ChangeContentObserver (Handler handler) {
super(handler);
}
public ChangeContentObserver () {
// TODO Auto-generated constructor stub
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Toast.makeText(MainActivity.this,"i:global_test value has changed!", Toast.LENGTH_LONG).show();
Log.d(TAG, "ChangeContentObserver --> onChange(" + selfChange + ") ");
}
}
//Setting 数据库中写值 this.getApplicationContext()
public static void SetGlobalData(Context cxt,String name,int value) {
try {
boolean rtv=false;
Log.i(TAG,"SetGlobalData rtv="+rtv);
rtv=Settings.Global.putInt(cxt.getContentResolver(), name, value);
Log.i(TAG,"SetGlobalData rtv="+rtv);
} catch (Exception e) {
if (e != null) {
Log.i(TAG, "setRecorderRear(Context," + value + ")> " + e.getMessage());
}
}
}
//Setting 数据库中读取值
public static int GetGlobalData(Context cxt,String name) {// Log.i("TAG",getdata() )
try {
return Settings.Global.getInt(cxt.getContentResolver(), name, -1);
} catch (Exception e) {
if (e != null) {
Log.i(TAG, "getRecorderRear(Context)> " + e.getMessage());
}
}
return 0;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
getContentResolver().unregisterContentObserver(mChangeContentObserver);
}
}
3.2 android_studio_app\settingdatebasedemo\app\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/itext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<Button
android:id="@+id/ibutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="write new value"
android:onClick="write_settings_database"/>
</LinearLayout>
3.3 settingdatebasedemo\app\src\main\AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.settingdatebasedemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="settingdatebasedemo"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:sharedUserId="android.uid.system"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>
</manifest>
注意添加 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>,不然会报error。
四、真机测试。
4.1 因为写settings数据库需要系统级app,adb push到机子里面
adb push settingdatebasedemo\app\build\outputs\apk\debug\settingdatebasedemo.apk /system/priv-app/
4.2 demo app运行效果
五:Android Studio 源码下载路径: