Android11 Settings加载流程

news2024/12/24 3:14:51

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

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>标签对应设置首页的每一个设置项。

key

配置项的主键

title

配置项的标题

summary

要标题下面的文字

icon

前面的图标

order

用来做排序的,值越小则排行越靠前

fragment

点击该item要跳转的界面

controller

该item的控制器,控制它的内容展示,是否可用,也可以控制它的点击事件等。

5、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可以判断这个标签就是二级菜单栏的主界面内容。

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

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

相关文章

【无公网IP】在外Windows远程连接MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自cpolar极点云文章&#xff1a;公网远程…

Camera API1 使用说明

Camera API2 使用说明 目录 一、开启相机 1.1创建项目 1.2注册权限 1.3配置相机特性要求 1.4 获取摄像头的个数 1.5 根据 ID 获取 CameraInfo facing 1.6 开启相机 1.7 关闭相机 二、预览 2.1认识 Parameters 2.2 设置预览尺寸 2.3添加预览 Surface 2.4 开启和关…

高级篇九、性能分析工具的使用

目录 2、查看系统性能参数3、统计SQL的查询成本&#xff1a;last_query_cost4、 定位执行慢的 SQL&#xff1a;慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 案例演示 2、查看系统性能参数 在MySQL中&#xff0c;可以使用 SHOW STATUS 语句查询一些MySQL数据库服务…

【C++】STL——list介绍及使用

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

安装Anaconda

一、Anaconda简介 Anaconda&#xff0c;一个开源的Python发行版本&#xff0c;可用于管理Python及其相关包&#xff0c;包含了conda、Python等180多个科学包及其依赖项。当我们需要不同的Pytorch版本的时候&#xff0c;不需要卸载重新安装&#xff0c;可以通过Anaconda创建不同…

短视频抖音账号矩阵系统源码---功能架构示例1

一、短视频账号矩阵系统源码开发服务器集群化处理开发成本更低&#xff08;前提&#xff09; 什么是集群化处理视频内存内耗&#xff1f;集群化处理视频内存内耗是指通过建立集群系统&#xff0c;将视频处理任务分配给多个计算节点进行并行处理&#xff0c;以减少单个计算节点…

氨基酸中间体35309-53-6,cyclo(Asp-Asp),CYCLO(-天冬氨酸-ASP)

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ 试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; cyclo(Asp-Asp)&#xff0c;35309-53-6&#xff0c;一种氨基酸中间体&…

平衡搜索二叉树——AVL树

AVL树 1. AVL树的概念2. AVL树节点的定义3. AVL树的插入思路4. AVL树的平衡调整思路平衡因子更新思路LL型——右单旋RR型——左单旋LR型——左右旋RL型——右左旋 5. AVL树插入判断平衡调整类型6. AVL树插入的代码实现7. AVL树总结8. AVL树的验证9. AVL树的性能 1. AVL树的概念…

600多个人工智能AI工具汇总(AIGC时代-超级个体的崛起),免费提供和介绍(第一讲)

这里是600多个人工智能AI工具汇总第一讲&#xff0c;每天介绍5个&#xff0c;主要是我写不完教程了&#xff0c;你懂的&#xff0c;视频最后会告诉大家获取方式的。现在请大家同我一起进入AIGC的世界。 第一个&#xff1a;《AIGC时代&#xff1a;超级个体的崛起》用来介绍AIGC…

【AI绘画】用魔法打败魔法,用ChatGPT生成绘画

随着人工智能技术的不断发展&#xff0c;我们可以利用ChatAI这款大语言模型来辅助我们在绘画过程中获得更多创意和灵感。 一、了解AI绘画功能 它可以快速、自动、准确地从大量原始数据中生成新内容&#xff0c;大大提高了内容创作效率&#xff0c;AI绘画使用机器学习算法&…

金色传说:SAP-MM-ME51N/ME52N采购申请增强

文章目录 业务场景一、增强方式:BADI二、增强步骤1.SE18/SE19创建增强实施2.增强代码3.实现效果总结业务场景 在企业中,通常需要控制采购业务中的特殊权限,本次遇到的业务场景:公司启用了SAP的 PPDS模块, 因此,需要控制业务员不能手动使用ME51N创建采购申请.因为标准的权限对象…

LNMP架构及应用部署(搭建电影网站)

目录 一、安装nginx 1、关闭防火墙和selinux 2、安装依赖软件 3、创建管理nginx用户 4、解压源码包 5、安装nginx 6、优化nginx命令 7、检测配置文件是否有错误 8、启动nginx 9、编辑nginx脚本&#xff08;可根据自己需求编辑&#xff09; 二、安装mysql数据库 1、先查看有没有…

Java安全——数字签名

Java安全 数字签名 签名类 签名的jar文件可以通过Java的jarsigner工具进行管理。jarsigner工具使用密钥库中的信息来查找特定的实体&#xff0c;并使用这些信息对jar文件进行签名或验证签名。 要创建签名的jar文件&#xff0c;我们可以使用以下命令&#xff1a; jarsigner…

游戏引擎的cpu/gpu粒子系统设计思想

开篇 网上有很多篇粒子系统源码解析&#xff0c;但是只是简单的接口罗列&#xff0c;没有从最原理出发去讲清楚粒子系统的来龙去脉&#xff0c;我将从粒子系统的本质去讲清楚它的设计理念&#xff0c;当理解了它的理念以后&#xff0c;很多粒子遇到的问题就会迎刃解决了&#…

常用的 Vs Code插件

推荐下自己在使用的 vs code 插件 1. Vue VSCode Snippets / Vue 3 Snippets 功能&#xff1a; 提供vue 相关代码块 2. Git History 功能&#xff1a;查看文件git提交历史 用法&#xff1a;右键你想要查看的文件&#xff0c;选 Git:Open File History 3. GitLens — Git …

LVS+Keepalived架构(负载均衡高可用集群)

一、高可用简介 普通的群集的部署是通过一台调度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度器的链路或则调度器本身出现故障时&#xff0c;就会导致整个业务的无法正常进行 而高…

超越传统标注方法:doccano平台提供智能化数据标注解决方案

目录 前言一、doccano的介绍、安装1-1、doccano的介绍1-2、doccano的安装、初始化配置 二、序列标注任务2-1、登录2-2、创建任务2-3、数据上传2-4、添加标签2-5、任务标注2-6、数据导出 总结 前言 Doccano是一种用于文本标注的开源工具&#xff0c;旨在简化和加速标注任务的进行…

RocketMQ5.0--定时消息

RocketMQ5.0–定时消息 一、定时消息概览 定时消息或延迟消息是指消息发送到Broker后&#xff0c;并不立即被消费而是要等到特定的时间后才能被消费。RocketMQ并不支持任意的时间精度延迟&#xff0c;只支持特定延迟时间的延迟消息。 消息延迟级别在Broker端通过MessageStore…

vue中控制element表格列的显示与隐藏

背景 根据‘执行进度计算方式’的单选框里面的选项不同&#xff0c;展示不同的column 按最小制剂单位统计: 按含量统计: 实现方式 就是拿到选项框里面的值&#xff0c;再根据里面的值来判断哪些column显示和隐藏&#xff1b;关于显示和隐藏可以设置变量&#xff1b; <…

SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Spring Data Spring Data是一个用于简化数据库访问和操作的开源框架&#xff0c;为开发人员提供了一种通用的方式来处理不同类型的数据存储&#xff0c;例如关系型数据…