基础篇.系统属性 & 跨进程 API
📢 1. 职业规划篇
来聊聊安卓职业规划?整机开发大专能做么?
📢 2.基础篇
基础篇.前言
基础篇.编译环境搭建
基础篇.源码目录简介
基础篇.系统 mk_bp 讲解
基础篇.开机动画定制
基础篇.定制桌面壁纸、导航方式
基础篇.系统属性、api 使用
基础篇.名称修改、名词介绍
基础篇.用 bugreport 带你看 Crash 和 ANR
基础篇.Provision 源码分析
📢 3. 系统应用篇
系统应用篇.开机向导制作一
系统应用篇.开机向导制作二
系统应用篇.Settings 导航切换分析
系统应用篇.开机向导导航切换一
系统应用篇.开机向导导航切换二
系统应用篇.gms 制作集成
系统应用篇.开机向导适配 GMS
系统应用篇.Launcher3 结构剖析一
系统应用篇.Launcher3 结构剖析二
系统应用篇.Launcher3 结构剖析三
系统应用篇.Launcher3 图标加载流程一
系统应用篇.Launcher3 图标加载流程二
系统应用篇.Launcher3 桌面布局定制
系统应用篇.解密 Partner、google PAI 机制
系统应用篇.Partner 机制预制壁纸、默认布局
系统应用篇.Launcher 双排 Hotseat 定制一
系统应用篇.Launcher 双排 Hotseat 定制二
系统应用篇.Launcher 双排 Hotseat 定制三
系统应用篇.Launcher Taskbar 简介以及调出
系统应用篇.SystemUI 篇_用工具教会你看布局、进程
系统应用篇.SystemUI 结构讲解一
系统应用篇.SystemUI 结构讲解二
系统应用篇.SystemUI 的启动流程
系统应用篇.SystemUI 导航栏创建一
系统应用篇.SystemUI 导航栏创建二
系统应用篇.SystemUI 自定义导航按键
系统应用篇.SystemUI 快捷面板下拉流程
系统应用篇.SystemUI 定制禁用锁屏下拉通知栏
系统应用篇.SystemUI 通知注册流程
系统应用篇.SystemUI 通知发送流程
📢 4. 系统篇
系统篇.SystemServer 篇_应用与系统进程间关系
系统篇.SystemServer 简介、自定义 Service 服务一
系统篇.SystemServer 简介、自定义 Service 服务二
系统篇.SystemServer 简介、自定义 Service 服务三
系统篇.SystemServer 简介、自定义 Service 服务四
系统篇.SELinux 问题解决套路一
系统篇.SELinux 问题解决套路二
系统篇.ActivityManagerService 简介
系统篇.WindowManagerService 简介一
系统篇.WindowManagerService 简介二
系统篇.PackageManagerService 简介一
系统篇.PackageManagerService 简介二
系统篇.FW 实战 - Letterbox 定制应用方向一
系统篇.FW 实战 - Letterbox 定制应用方向二
系统篇.分屏流程一
系统篇.分屏流程二
📢 5. 性能篇
(省)低内存优化
性能篇 (省). 低内存查杀机制
性能篇 (省).SystemServer 与 LMK 的 socket 通信
性能篇 (省). 内核进程 LMKD
性能篇 (省). 内存分析
性能篇 (省). 内存泄漏定位与解决
(稳)稳定性优化
性能篇 (稳).WatchDog 检测机制一
性能篇 (稳).WatchDog 检测机制二
性能篇 (稳). 深入 Crash 捕获器流程一
性能篇 (稳). 深入 Crash 捕获器流程二
性能篇 (稳). 深入炸弹 ANR 流程一
性能篇 (稳). 深入炸弹 ANR 流程二
(快)开机优化
性能篇 (快). 开机耗时分析
性能篇 (快). 开机耗时优化
性能篇.实战优化方案分享
framework交流,答疑:251662478
—— 开发 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)。
SystemProperties.get("ro.product.model", "Unknown")
带默认值,如果属性不存在,返回 "Unknown"。
📌 2.2 设置系统属性
📌 只能在 system 进程 或 具有 android:sharedUserId=“android.uid.system” 权限的 APP 设置系统属性
SystemProperties.set("persist.sys.theme_mode", "dark");
📌 常见属性示例:
🔹 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监听系统变化。
🔥 你学会了吗?欢迎留言交流! 🚀