Android 使用ContentObserver监听SettingsProvider值的变化

1、Settings原理

Settings 设置、保存的一些值,最终是存储到 SettingsProvider 的数据库
例如:
Settings.Global.putInt(getContentResolver(), "SwitchLaunch", 0);
Settings.System.putInt(getContentResolver(), "SwitchLaunch", 0);
Settings.Secure.putInt(getContentResolver(), "SwitchLaunch", 0);

2、保存值的前提条件

2.1 需要是系统应用
2.2 需要添加以下权限
-

3、adb 中使用命令行设置值和读取值的方法

//设置值
settings put global SwitchLaunch 1

//读取值
settings get global SwitchLaunch

4、registerContentObserver注册监听

registerContentObserver(Uri uri, boolean notifyForDescendants,ContentObserver observer) {} ,

3个参数

  • uri :被监听数据的 uri ,可以通过 Settings.Global.getUriFor(“key”) 得到。
  • notifyForDescendants :false 表示精确匹配。true 表示还可以匹配 uri 派生的 uri 。
  • observer :数据变化时接收消息的 ContentObserver

 5、注销监听

getContentResolver().unregisterContentObserver(mObserver);

 6、完整代码示例

import android.annotation.SuppressLint;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private MyContentObserver mObserver;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mObserver = new MyContentObserver(mHandler);

        Uri uri = Settings.Global.getUriFor("SwitchLaunch");//这里的key可以自定义,也可以监 
        听其他,例如:监听蓝牙开关 Settings.Global.BLUETOOTH_ON
        getContentResolver().registerContentObserver(uri, true, mObserver);
       
    }


    private static class MyContentObserver extends ContentObserver {

        /**
         * Creates a content observer.
         *
         * @param handler The handler to run {@link #onChange} on, or null if none.
         */
        public MyContentObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange, @Nullable Uri uri) {
            super.onChange(selfChange, uri);
          //命令行设置值的时候,这里会调用
            Log.d("AAAAA", "MyContentObserver onChange=" + selfChange + "uri=" + uri.getPath());

        }
    }

    private static Handler mHandler = new Handler(Looper.getMainLooper()) {

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
    };



  @Override
    protected void onStop() {
        super.onStop();
        if (null != mObserver) {
            getContentResolver().unregisterContentObserver(mObserver);
            mObserver = null;
        }
    }


}

你可能感兴趣的:(Android,Android系统,android)