深入解析 Android 系统属性 跨进程 API:SystemProperties、ContentObserver 的使用

news2025/2/12 0:32:08

基础篇.系统属性 & 跨进程 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监听系统变化。

🔥 你学会了吗?欢迎留言交流! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器(MLP, Multi-Layer Perceptron) 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…

PromptSource官方文档翻译

目录 核心概念解析 提示模板(Prompt Template) P3数据集 安装指南 基础安装(仅使用提示) 开发环境安装(需创建提示) API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步,测试方法也在演变。企业需要紧跟新兴趋势,以提升软件质量、提高测试效率,并确保安全性,在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…

js的DOM一遍过

一、获取元素 1.根据id获取 document.getElementById(id);2.根据标签名获取 使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。 document.getElementsByTagName(标签名);获取某个元素(父元素)内部所有指定标签名的子元素。 element.getElementsByTag…

Machine Learning:Introduction

文章目录 Machine LearningTrainingStep 1.Contract Function with Unknown ParametersStep 2.Define Loss from Training DataStep 3.Optimization Linear ModelPiecewise Linear CurveBeyond Piecewise Liner?FunctionLossOptimization Model Deformation Machine Learning …

Excel 笔记

实际问题记录 VBA脚本实现特殊的行转列 已知:位于同一Excel工作簿文件中的两个工作表:Sheet1、Sheet2。 问题:现要将Sheet2中的每一行,按Sheet1中的样子进行转置: Sheet2中每一行的黄色单元格,为列头。…

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时,如果研究区较大,一个月的影像覆盖不了整个研究区,就会有缺失的地方,还有就是去云之后,有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…

如何在浏览器中搭建开源Web操作系统Puter的本地与远程环境

文章目录 前言1.关于Puter2.本地部署Puter3.Puter简单使用4. 安装内网穿透5.配置puter公网地址6. 配置固定公网地址 前言 嘿,小伙伴们!是不是每次开机都要像打地鼠一样不停地点击各种网盘和应用程序的登录按钮,感觉超级麻烦?更让…

使用EVE-NG-锐捷实现单臂路由

一、基础知识 1.三层vlan vlan在三层环境中通常用作网关vlan配上ip网关内部接口ip 2.vlan创建步骤 创建vlan将接口划分到不同的vlan给vlan配置ip地址 二、项目案例 1、项目拓扑 2、项目实现 PC1配置 配置PC1IP地址为192.168.1.10/24网关地址为192.168.1.1 ip 192.168.1…

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细,感觉很强大有木有,关键还会生成流程图,对程序员理解业务非常有帮忙,基本能做到哪里不懂点哪里。…

HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)

目录 前言 GPIO(通用输入输出引脚) 推挽输出模式 浮空输入和上拉输入模式 GPIO其他模式以及内部电路原理 输出驱动器 输入驱动器 中断 外部中断(EXTI) 深入中断(内部机制及原理) 外部中断/事件控…

HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发,当容器是ArkTS组件,子组件在Native侧创建时&#…

[AI]Mac本地部署Deepseek R1模型 — — 保姆级教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆级教程 DeepSeek R1是中国AI初创公司深度求索(DeepSeek)推出大模型DeepSeek-R1。 作为一款开源模型,R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI o1模型正式版,并采用MI…

群晖NAS如何通过WebDAV和内网穿透实现Joplin笔记远程同步

文章目录 前言1. 检查群晖Webdav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar工具4. 创建Webdav公网地址5. Joplin连接WebDav6. 固定Webdav公网地址7. 公网环境连接测试 前言 在数字化浪潮的推动下,笔记应用已成为我们记录生活、整理思绪的重要工具。Joplin&…

CSS3+动画

浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…

C++ list介绍

文章目录 1. list简介2. list的实现框架2.1 链表结点2.2 链表迭代器2.3 链表 3. list迭代器及反向迭代器设计3.1 list迭代器3.2 list反向迭代器3.3 list迭代器失效 4. list与vector比较 1. list简介 list,即链表。 链表的种类有很多,是否带头结点&#…

Java - 在Linux系统上使用OpenCV和Tesseract

系统环境 确保Linux系统安装了cmake构建工具,以及java和ant(这两者如果没有,可能会影响到后面编译opencv生成.so和.jar文件)。 sudo apt-get update sudo apt-get install build-essential sudo apt install cmake build-essen…

自有服务与软件包

—— 小 峰 编 程 目录 ​编辑 一、自有服务概述 二、systemctl管理服务命令 1、显示服务 2、查看启动和停止服务 3、服务持久化 三、常用自有服务(ntp,firewalld,crond) 1、ntp时间同步服务 1)NTP同步服务器原理 2)到哪里去找NPT服务…

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…