Android11 Settings详解

发布于:2025-06-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

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

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


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


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.csdn.net/weixin_47465999/article/details/131596008


网站公告

今日签到

点亮在社区的每一天
去签到