Android Settings详解

目录

一、系统设置首页(一级菜单)

1、Settings

2、AndroidManifest.xml

3、SettingsHomepageActivity

4、TopLevelSettings

5、top_level_settings.xml

6、DashboardFragment

 二、系统设置二级菜单实现

1、SubSettings

2、SettingsActivity

3、settings_main_prefs.xml

 三、加载默认亮度

1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController

四、字体调节

1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml


本文基于android11 aosp,

一、系统设置首页(一级菜单)


1、Settings


        之所以要在此定义空的Activity,是为了外部应用能直接跳转到XX_SettingsActivity界面,因为如果只是fragment的话,外部是没法跳转到fragment界面的,跳转到XX_SettingsActivity时,会执行其父类SettingsActivity.java中的方法,并根据XX_SettingsActivity在清单文件中的注册信息, 它的meta-data的值,找到XX_SettingsActivity对应的fragment(XX_Settings),显示出fragment界面,实现借壳。

2、AndroidManifest.xml


        Settings主界面Activity使用的是Settings.java,子界面Activity使用的是SubSettings.java,Settings与SubSetting中的内部类都是空Activity(没有重写七大生命周期方法),都继承于SettingsActivity.

从AndroidManifest.xml文件中得知主页面是.homepage.SettingsHomepageActivity。

以WifiSettings为例

3、SettingsHomepageActivity


①onCreate


②showFragment
封装方法中进行了加载fragment的实现

4、TopLevelSettings


        TopLevelSettings继承自抽象类DashboardFragment, 实现抽象方法getPreferenceScreenResId()并返回preference的配置文件即可完成静态配置。

TopLevelSettings类中还有一个比较重要的就是在onAttach()方法中调用了父类DashboardFragment的onAttach()方法,这个方法主要是加载preference controllers。

5、top_level_settings.xml


        主标签是一个<PreferenceScreen>标签,里有多个<Preference>标签。每个<Preference>标签对应设置首页的每一个设置项。

6、DashboardFragment


①onCreatePreferences


②refreshAllPreferences


③displayResourceTiles
addPreferencesFromResource方法是将preferenceScreen下所有Preference添加到ArrayList中,然后再根据此集合构建生成PreferenceGroupAdapter,最后将此adapter设置到listview中,完成数据绑定,从而完成界面加载。

④refreshDashboardTiles
⑤onAttach

   @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray(
                R.array.config_suppress_injected_tile_keys));
        mDashboardFeatureProvider = FeatureFactory.getFactory(context).
                getDashboardFeatureProvider(context);
        // Load preference controllers from code
        //从代码加载首选项控制器
        final List<AbstractPreferenceController> controllersFromCode =
                createPreferenceControllers(context);
        // Load preference controllers from xml definition
        //从 xml 定义加载首选项控制器
        final List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper
                .getPreferenceControllersFromXml(context, getPreferenceScreenResId());
        // Filter xml-based controllers in case a similar controller is created from code already.
        //过滤基于 xml 的控制器,以防已经从代码创建了类似的控制器。
        final List<BasePreferenceController> uniqueControllerFromXml =
                PreferenceControllerListHelper.filterControllers(
                        controllersFromXml, controllersFromCode);

        // Add unique controllers to list.
        //将唯一的控制器添加到列表中
        if (controllersFromCode != null) {
            mControllers.addAll(controllersFromCode);
        }
        mControllers.addAll(uniqueControllerFromXml);

        // And wire up with lifecycle.
        //并与生命周期联系起来。
        final Lifecycle lifecycle = getSettingsLifecycle();
        uniqueControllerFromXml.forEach(controller -> {
            if (controller instanceof LifecycleObserver) {
                lifecycle.addObserver((LifecycleObserver) controller);
            }
        });
        // Set metrics category for BasePreferenceController.
        //为 BasePreferenceController 设置指标类别。
        final int metricCategory = getMetricsCategory();
        mControllers.forEach(controller -> {
            if (controller instanceof BasePreferenceController) {
                ((BasePreferenceController) controller).setMetricsCategory(metricCategory);
            }
        });

        mPlaceholderPreferenceController =
                new DashboardTilePlaceholderPreferenceController(context);
        mControllers.add(mPlaceholderPreferenceController);
        for (AbstractPreferenceController controller : mControllers) {
            addPreferenceController(controller);
        }
    }


 
二、系统设置二级菜单实现


1、SubSettings


        系统设置的二级菜单界面Activity是SubSettings类,SubSettings类虽然是一个Activity但是它是一个空的Activity,它不继承Activity7大生命周期。

2、SettingsActivity


①onCreate


布局文件:settings_main_prefs

启动Fragment

②getMetaData


以WifiSettingsActivity为例

③getIntent


④getStartingFragmentClass


⑤launchSettingFragment


⑥switchToFragment

3、settings_main_prefs.xml


        布局文件由<SwitchBar>和<FrameLayout>和<RelativeLayout>标签组成,<RelativeLayout>标签默认是隐藏的。根据<FrameLayout>标签的id可以判断这个标签就是二级菜单栏的主界面内容。

 三、加载默认亮度


1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings


①getPreferenceScreenResId


②buildPreferenceControllers

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController


①getCurrentBrightness


②convertLinearToGammaFloat

四、字体调节


1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml



原文链接:https://blog.youkuaiyun.com/weixin_47465999/article/details/131596008

<think>好的,我现在需要帮助用户了解或开发与Android Settings相关的框架,特别是关于Settings Framework的开发文档或源码解析。首先,用户提到的参考资料里有三个引用,我需要仔细看看这些引用是否相关,并从中提取有用的信息。 首先,引用[1]提到了Android Settings解析,包括SettingsIntelligence和SettingsProvider,这可能涉及到Settings应用的结构和底层数据提供者。引用[2]是关于Android系统开发的指导,提到需要研究系统服务的源码,比如ActivityManagerService和WindowManagerService,这可能对理解Settings框架有帮助。引用[3]则介绍了源码目录中的data目录,里面包含资源文件,比如字体、声音等,这可能与Settings的UI资源有关。 用户的需求是寻找开发文档或源码解析,但可能官方文档不够详细,所以需要依赖源码分析和相关指南。我需要整理出Settings框架的主要组成部分,并指出源码的位置,以及如何分析这些代码。 首先,Android Settings应用的结构可能分为应用层(UI部分)和框架层(系统服务)。应用层可能位于packages/apps/Settings,而框架层可能涉及frameworks/base中的相关服务,比如SettingsProvider。需要指出这些模块的位置,并说明如何查阅源码。 其次,SettingsProvider作为系统Provider,处理设置的存储和访问,这部分源码可能在frameworks/base/packages/SettingsProvider。需要解释它的作用,比如存储系统设置、安全配置等,并给出关键类,如Settings.java。 然后,系统服务中的Settings相关的服务可能包括DevicePolicyManager,这些服务的管理逻辑可能在frameworks/base/services/core/java/com/android/server目录下,例如DevicePolicyManagerService。 另外,资源文件的位置也很重要,比如data目录中的资源,如布局和字符串,这些可能在packages/apps/Settings/res下,用户可能需要修改这些资源来自定义界面。 开发建议方面,用户可能需要学习如何定制Settings模块,比如添加新设置项或修改现有逻辑。需要指导他们如何修改布局文件,添加自定义Preference,或者修改SettingsProvider的逻辑。 此外,用户可能需要调试和测试他们的修改,比如使用adb命令访问设置项,或者查看数据库内容。例如,使用settings命令或查询SettingsProvider的数据库。 最后,生成的相关问题需要围绕Settings框架的组成部分、源码分析步骤、定制方法、调试工具等,帮助用户深入理解。 现在需要确保回答结构清晰,分点说明源码位置、关键模块、开发建议和调试方法,并正确引用提供的资料。同时,使用中文回答,行内公式用$...$,独立公式用$$...$$,但这里可能不太涉及数学公式,所以重点放在代码块和结构上。</think>### Android Settings Framework 开发与源码解析 Android Settings Framework 是系统设置功能的核心,涉及应用层交互、数据存储和系统服务整合。以下是开发与源码分析的关键点: --- #### 一、源码结构与核心模块 1. **Settings 应用层源码** - **路径**: `packages/apps/Settings/` - **功能**: 包含用户界面(如设置主界面、Wi-Fi、蓝牙等子模块),使用 `PreferenceFragment` 管理交互逻辑。 - **关键类**: - `Settings.java`: 入口 Activity - `WirelessSettings.java`: 网络相关设置 - `SecuritySettings.java`: 安全配置[^1] 2. **SettingsProvider 数据存储** - **路径**: `frameworks/base/packages/SettingsProvider/` - **作用**: 管理系统设置的持久化存储(如系统全局配置、安全策略),通过 `ContentProvider` 提供访问接口。 - **关键类**: - `Settings.java`: 定义 `System`, `Secure`, `Global` 三类命名空间的键值对[^3]。 - **数据库路径**: `/data/data/com.android.providers.settings/databases/settings.db` 3. **系统服务整合** - **路径**: `frameworks/base/services/core/java/com/android/server/` - **示例**: - `DevicePolicyManagerService.java`: 设备策略管理(如企业级限制) - `WifiService.java`: Wi-Fi 功能底层控制[^2] --- #### 二、开发与定制指南 1. **添加新设置项** - **步骤**: 1. **UI 层**: 在 `res/xml/` 下新增 Preference XML 文件,定义布局。 2. **逻辑层**: 继承 `PreferenceFragment`,绑定点击事件。 3. **数据层**: 通过 `Settings.System.putInt()` 等方法写入系统数据库。 - **代码片段**: ```java // 添加开关控件 SwitchPreference customPref = findPreference("custom_key"); customPref.setOnPreferenceChangeListener((preference, newValue) -> { Settings.System.putInt(getContentResolver(), "CUSTOM_SETTING", (Boolean) newValue ? 1 : 0); return true; }); ``` 2. **修改系统默认设置** - **路径**: `frameworks/base/packages/SettingsProvider/res/values/defaults.xml` - **示例**: 调整默认屏幕超时时间: ```xml <integer name="def_screen_off_timeout">300000</integer> <!-- 5分钟 --> ``` 3. **跨进程通信机制** - **Binder 与 AIDL**: Settings 通过 `SettingsProvider` 提供的 `ContentResolver` 与系统服务(如 `PowerManagerService`)交互[^2]。 --- #### 三、调试与分析工具 1. **ADB 命令调试** - 查看当前系统设置: ```bash adb shell settings get system screen_off_timeout ``` - 修改设置值: ```bash adb shell settings put secure bluetooth_name "MyDevice" ``` 2. **数据库直接访问** ```bash adb shell sqlite3 /data/data/com.android.providers.settings/databases/settings.db > SELECT * FROM system WHERE name='screen_off_timeout'; ``` 3. **日志过滤** ```bash adb logcat -s SettingsProvider # 监控设置数据变更 ``` --- #### 四、参考文档与进阶学习 1. **官方资源**: - [Android 开发者设置指南](https://developer.android.com/guide/topics/ui/settings) - [AOSP 源码查看](https://android.googlesource.com/platform/packages/apps/Settings/) 2. **书籍推荐**: - *《Android 系统源码情景分析》*: 详解系统服务与 Framework 层设计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳哥的技术分享

创作不易,谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值