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 需要添加以下权限
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />-
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
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;
}
}
}