• Android 使用ContentObserver监听SettingsProvider值的变化


    1、Settings原理

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

    2、保存值的前提条件

    2.1 需要是系统应用
    2.2 需要添加以下权限
    1. <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />-
    2. <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

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

    1. //设置值
    2. settings put global SwitchLaunch 1
    3. //读取值
    4. 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、完整代码示例

    1. import android.annotation.SuppressLint;
    2. import android.database.ContentObserver;
    3. import android.net.Uri;
    4. import android.os.Bundle;
    5. import android.os.Handler;
    6. import android.os.Looper;
    7. import android.os.Message;
    8. import android.provider.Settings;
    9. import android.util.Log;
    10. import androidx.annotation.NonNull;
    11. import androidx.annotation.Nullable;
    12. import androidx.appcompat.app.AppCompatActivity;
    13. public class MainActivity extends AppCompatActivity {
    14. private MyContentObserver mObserver;
    15. @SuppressLint("MissingInflatedId")
    16. @Override
    17. protected void onCreate(Bundle savedInstanceState) {
    18. super.onCreate(savedInstanceState);
    19. setContentView(R.layout.activity_main);
    20. mObserver = new MyContentObserver(mHandler);
    21. Uri uri = Settings.Global.getUriFor("SwitchLaunch");//这里的key可以自定义,也可以监
    22. 听其他,例如:监听蓝牙开关 Settings.Global.BLUETOOTH_ON
    23. getContentResolver().registerContentObserver(uri, true, mObserver);
    24. }
    25. private static class MyContentObserver extends ContentObserver {
    26. /**
    27. * Creates a content observer.
    28. *
    29. * @param handler The handler to run {@link #onChange} on, or null if none.
    30. */
    31. public MyContentObserver(Handler handler) {
    32. super(handler);
    33. }
    34. @Override
    35. public void onChange(boolean selfChange, @Nullable Uri uri) {
    36. super.onChange(selfChange, uri);
    37. //命令行设置值的时候,这里会调用
    38. Log.d("AAAAA", "MyContentObserver onChange=" + selfChange + "uri=" + uri.getPath());
    39. }
    40. }
    41. private static Handler mHandler = new Handler(Looper.getMainLooper()) {
    42. @Override
    43. public void handleMessage(@NonNull Message msg) {
    44. super.handleMessage(msg);
    45. }
    46. };
    47. @Override
    48. protected void onStop() {
    49. super.onStop();
    50. if (null != mObserver) {
    51. getContentResolver().unregisterContentObserver(mObserver);
    52. mObserver = null;
    53. }
    54. }
    55. }

  • 相关阅读:
    Tarjan强连通分量详解
    Vue3源码解读之patch
    python OS模块
    二叉搜索树
    linux系统操作/基本命令/vim/权限修改/用户建立
    java毕业生设计药品管理系统演示录像2021计算机源码+系统+mysql+调试部署+lw
    搜索二叉树【C++】
    PWA建快应用,小程序建超级App?
    CSS相关
    03使用Spring基于XML的方式注册第一个组件
  • 原文地址:https://blog.csdn.net/banzhuantuqiang/article/details/134020554