📢 1. 职业规划篇
📢 2.基础篇
基础篇.用 bugreport 带你看 Crash 和 ANR
📢 3. 系统应用篇
系统应用篇.解密 Partner、google PAI 机制
📢 4. 系统篇
系统篇.SystemServer 简介、自定义 Service 服务一
系统篇.SystemServer 简介、自定义 Service 服务二
系统篇.SystemServer 简介、自定义 Service 服务三
系统篇.SystemServer 简介、自定义 Service 服务四
📢 5. 性能篇
(省)低内存优化
性能篇 (省).SystemServer 与 LMK 的 socket 通信
(稳)稳定性优化
(快)开机优化
framework交流,答疑:251662478
🔥 深入解析 Android 系统属性 & 跨进程 API:SystemProperties、ContentObserver 的使用
—— 开发 AOSP、定制 ROM 必备技能!
在 Android 系统开发中,我们经常需要在不同进程间传递 系统级配置、设备信息、开关状态 等数据。
Google 提供了 SystemProperties & ContentObserver 作为 跨进程 API,帮助我们 安全、高效地获取 & 监听系统属性。
今天,我们就来深入解析 SystemProperties & ContentObserver 的使用场景、代码示例、底层实现原理!🚀
🔹 1. 什么是 SystemProperties?
SystemProperties(系统属性) 是 Android 提供的一套 跨进程的 key-value 存储机制,用于存储系统配置参数。
📌 作用:
- 存储 & 读取 系统级别的配置(如
ro.build.version.sdk获取 Android 版本号)。 - 各进程间共享数据(跨进程访问,类似 全局变量)。
- 用于设备适配(不同机型可以通过
ro.product.device读取设备信息)。 - 系统 & 应用控制开关(如
persist.sys.theme_mode控制深色模式)。
📌 存储位置:
- Android 系统属性存储在内核共享内存中(基于
property_service)。 - 读取时,不需要 IPC 通信,非常高效。
🔹 2. SystemProperties 代码示例
📌 2.1 读取系统属性
Java 代码:
import android.os.SystemProperties;
public class SystemPropertyDemo {
public static void main(String[] args) {
// 读取 Android 版本
String sdkVersion = SystemProperties.get("ro.build.version.sdk");
System.out.println("Android SDK Version: " + sdkVersion);
// 读取设备型号
String deviceModel = SystemProperties.get("ro.product.model", "Unknown");
System.out.println("Device Model: " + deviceModel);
}
}
📌 参数解析:
SystemProperties.get("ro.build.version.sdk")-
- 获取 系统 SDK 版本(如 Android 13 返回
33)。
- 获取 系统 SDK 版本(如 Android 13 返回
SystemProperties.get("ro.product.model", "Unknown")-
- 带默认值,如果属性不存在,返回
"Unknown"。
- 带默认值,如果属性不存在,返回
📌 2.2 设置系统属性
📌 只能在 system 进程 或 具有 android:sharedUserId="android.uid.system" 权限的 APP 设置系统属性
SystemProperties.set("persist.sys.theme_mode", "dark");
📌 常见属性示例:
| 属性名称 | 作用 |
|---|---|
| ro.build.version.release | 获取 Android 版本(如 13) |
| ro.product.model | 设备型号 |
| persist.sys.theme_mode | 主题模式(light / dark) |
| ro.debuggable | 设备是否可调试 (1 = 是, 0 = 否) |
🔹 3. 什么是 ContentObserver?
ContentObserver 是 Android 提供的跨进程监听机制,可以监听 数据库、系统设置 变化。
📌 作用:
- 监听系统属性变化(如
Settings.System.SCREEN_BRIGHTNESS屏幕亮度变化)。 - 监听数据库变更(如短信、联系人、WiFi 设置变化)。
- 监听自定义
ContentProvider变更(适用于 进程间通信)。
🔹 4. ContentObserver 代码示例
📌 4.1 监听系统亮度变化
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
import android.content.Context;
public class BrightnessObserver extends ContentObserver {
private Context context;
public BrightnessObserver(Handler handler, Context context) {
super(handler);
this.context = context;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
try {
int brightness = Settings.System.getInt(
context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS
);
System.out.println("屏幕亮度变化:" + brightness);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 注册监听器
public void registerBrightnessObserver(Context context) {
Handler handler = new Handler();
BrightnessObserver observer = new BrightnessObserver(handler, context);
Uri uri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
context.getContentResolver().registerContentObserver(uri, false, observer);
}
📌 关键解析:
Settings.System.SCREEN_BRIGHTNESS系统亮度设置项。context.getContentResolver().registerContentObserver(uri, false, observer)注册监听。
📌 4.2 监听系统音量变化
Uri volumeUri = Settings.System.getUriFor(Settings.System.VOLUME_MUSIC);
context.getContentResolver().registerContentObserver(volumeUri, false, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
int volume = Settings.System.getInt(context.getContentResolver(), Settings.System.VOLUME_MUSIC, 0);
System.out.println("系统音量变化:" + volume);
}
});
🔹 5. SystemProperties vs ContentObserver 对比
| 功能 | SystemProperties | ContentObserver | |---|---| | 数据存储位置 | 共享内存 | SQLite、ContentProvider | | 跨进程支持 | ✅ 是 | ✅ 是 | | 是否支持监听 | ❌ 不支持 | ✅ 支持 | | 适用场景 | 获取系统属性 | 监听数据库/设置变更 | | 修改方式 | SystemProperties.set | 通过 Settings.System.put 修改 |
🔹 6. SystemProperties & ContentObserver 结合使用
📌 监听 SystemProperties 变化,需要用 ContentObserver
Uri uri = Settings.System.getUriFor("persist.sys.theme_mode");
context.getContentResolver().registerContentObserver(uri, false, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
String themeMode = SystemProperties.get("persist.sys.theme_mode", "light");
System.out.println("主题模式变更:" + themeMode);
}
});
🔹 7. 总结
- SystemProperties 用于 存储 & 读取 系统级别的配置,但 不能监听变化。
- ContentObserver 可以 监听系统设置、数据库 变化,适用于 动态监控 需求。
- SystemProperties + ContentObserver 结合使用,可以实现 系统属性监听,适用于 主题切换、模式变更等场景。
- 系统级 APP(如
Settings、SystemUI) 广泛使用SystemProperties进行 设备适配 &ContentObserver监听系统变化。
🔥 你学会了吗?欢迎留言交流! 🚀