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"?>        

 

      3.3 settingdatebasedemo\app\src\main\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                    

     注意添加 ,不然会报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 源码下载路径:

https://download.csdn.net/download/qq_37858386/12513319

 

 

 

更多相关文章

  1. Android(安卓)M 新的运行时权限开发者需要知道的一切
  2. Android(安卓)FileProvider详细解析和踩坑指南
  3. 2017.03.12 Android卡顿分析
  4. android如何导入已有数据库
  5. android设备uuid、udid
  6. Android(安卓)SQlite数据库的使用(一)-一学就会android数据库
  7. Android系统数据传递机制
  8. android按键静音键功能实现
  9. Android(安卓)6.0 运行时权限处理完全解析

随机推荐

  1. Android中TextVIew一些属性
  2. Android的布局方法
  3. 《Android深入透析》之Android事件分发机
  4. Android美工之Shape
  5. 如何下载android源码与android内核源码
  6. Android消息循环实现原理分析
  7. Android异步处理一:使用Thread+Handler实
  8. Android(安卓)自定义属性与xmlns
  9. Android帧率测试
  10. 《Android开发从零开始》――13.Table La