【AOSP】Settings应用界面逻辑

2023-11-07

源码参考: AOSPXRef

现象效果

调试UI显示:Settings应用子界面Activity绝大部分都是SubSetting(通过dumpsys指令查看当前活动);

adb shell dumpsys activity activities | grep -i mCurrent
com.android.settings/com.android.settings.SubSettings

代码实现:

(1)Java类文件

  • Settings与SubSettings中基本是空Activity,即Activity没有重写任意7大生命周期方法 (/*empty*/)  
  • Settings类和各子xxxSettingsActivity都继承自SettingsActivity类
  • Settings类中定义各子静态xxxSettingsActivity类
    • 静态内部类在AndroidManifest.xml文件中通过<meta-data>将相应的Fragment绑定起来。
package com.android.settings;
/**
* Top-level Settings activity
*/
public class Settings extends SettingsActivity {
    /*
    * Settings subclasses for launching independently.
    */
    public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
}


(2)布局文件

(3)代码实现

  1. 父类 SettingsActivity的onCreate()方法确定加载的SubSettingsActivity 布局
    1. setContentView(R.layout.settings_main_prefs)
  2. 初次启动对应的Fragment
    1. launchSettingFragment(initialFragmentName, intent);
public class SettingsActivity extends SettingsBaseActivity
        implements IMainSwitchBar, PreferenceManager.OnPreferenceTreeClickListener,
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
        ButtonBarHandler, FragmentManager.OnBackStackChangedListener { 
    @Override
    protected void onCreate(Bundle savedState) { 
        super.onCreate(savedState);
        //...omit some codes
        final FeatureFactory factory = FeatureFactory.getFactory(this);
        mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);
        //通过判断当前是Settings还是SubSettings来确定用什么布局来显示
        // This is a "Sub Settings" when:
        // - this is a real SubSettings
        // - or :settings:show_fragment_as_subsetting is passed to the Intent
        final boolean isSubSettings = this instanceof SubSettings ||
                intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
        
        // If this is a sub settings, then apply the SubSettings Theme for the ActionBar content
        // insets.
        // If this is in setup flow, don't apply theme. Because light theme needs to be applied
        // in SettingsBaseActivity#onCreate().
        if (isSubSettings && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
           setTheme(R.style.Theme_SubSettings);
        }
        //设置布局界面
        //(0)android 9-
        /*mIsShowingDashboard = className.equals(Settings.class.getName());
        setContentView(mIsShowingDashboard ?
               R.layout.settings_main_dashboard : R.layout.settings_main_prefs);
        getSupportFragmentManager().addOnBackStackChangedListener(this);*/
        //(1)android 10+
        setContentView(R.layout.settings_main_prefs);
        //....
       if (savedState != null) {
          // We are restarting from a previous saved state; used that to initialize, instead
          // of starting fresh.
          setTitleFromIntent(intent);

          ArrayList<DashboardCategory> categories =
                  savedState.getParcelableArrayList(SAVE_KEY_CATEGORIES);
          if (categories != null) {
             mCategories.clear();
             mCategories.addAll(categories);
             setTitleFromBackStack();
          }
       } else {
          launchSettingFragment(initialFragmentName, intent);
       }
   }
}
onCreate:312, ApnSettings (com.android.settings.network)
performCreate:2685, Fragment (androidx.fragment.app)
create:280, FragmentStateManager (androidx.fragment.app)
moveToState:1187, FragmentManager (androidx.fragment.app)
addToFirstInLastOut:1255, FragmentTransition (androidx.fragment.app)
calculateFragments:1138, FragmentTransition (androidx.fragment.app)
startTransitions:136, FragmentTransition (androidx.fragment.app)
executeOpsTogether:2001, FragmentManager (androidx.fragment.app)
removeRedundantOperationsAndExecute:1959, FragmentManager (androidx.fragment.app)
execPendingActions:1861, FragmentManager (androidx.fragment.app)
executePendingTransactions:489, FragmentManager (androidx.fragment.app)
switchToFragment:615, SettingsActivity (com.android.settings)
launchSettingFragment:403, SettingsActivity (com.android.settings)
onCreate:310, SettingsActivity (com.android.settings)
onCreate:222, Settings$ApnSettingsActivity (com.android.settings)
performCreate:8137, Activity (android.app)
performCreate:8121, Activity (android.app)
callActivityOnCreate:1309, Instrumentation (android.app)
performLaunchActivity:3446, ActivityThread (android.app)
handleLaunchActivity:3637, ActivityThread (android.app)
execute:85, LaunchActivityItem (android.app.servertransaction)
executeCallbacks:135, TransactionExecutor (android.app.servertransaction)
execute:95, TransactionExecutor (android.app.servertransaction)
handleMessage:2105, ActivityThread$H (android.app)
dispatchMessage:106, Handler (android.os)
loop:223, Looper (android.os)
main:7707, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:612, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:997, ZygoteInit (com.android.internal.os)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【AOSP】Settings应用界面逻辑 的相关文章

  • RecyclerView每隔几个项目都是相同的 - 可扩展项目

    我的 recyclerView 有问题 我正在使用此布局来扩展 recyclerView 中的 cardView https github com AAkira ExpandableLayout https github com AAkir
  • getItemAtPosition() 未在列表视图中返回值

    我创建了一个自定义基本适配器类 用图像和文本填充列表视图 类的代码如下 public class ViewAdapter extends BaseAdapter private Activity activity private Strin
  • 检测正在插入的设备

    我希望能够检测设备是否已插入 我希望能够像查询连接状态一样进行查询 这可能吗 或者我是否需要创建一个监听电池事件的广播接收器 显然是ACTION BATTERY CHANGED http developer android com refe
  • 从 admob 独立 SDK 切换到 Google Play 服务 SDK 时,apk 大小会膨胀

    使用 Admob SDK 我的 apk 大小为 230Kb 当用 google play services SDK 替换 Admob SDK 时 它是 1 5MB 膨胀了 6 倍以上 我想完整的 Google Play 服务客户端 SDK
  • 读取 Android 4.2 中的 APN?

    我有个问题阅读 APN在安卓v4 2中 是读 不是写APNS 它抛出一个安全异常 没有写入 APN 设置的权限 用户 10068 和当前用户都没有权限 进程有 android permission WRITE APN SETTINGS 相同
  • Android - 启用和禁用蓝牙 - SDK 3 (OS 1.5) - 以编程方式?

    我编写了代码来以编程方式启用和禁用各种功能 例如 Wifi 振铃模式 飞行模式 您将在电源切换小部件中看到的所有内容 我还没有找到如何做的一个是蓝牙 看来在 SDK level 3 OS 1 5 中没有漂亮的蓝牙管理器类 有没有人指出关于启
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • XAMARIN - 添加来自 youtube 的视频

    我搜索如何从 youtube 添加视频的信息 例如 我想从一些 YouTube 链接添加视频 我认为它应该在网络视图中 但我需要一些详细信息 因为我找不到有关我的问题的任何信息 您可以使用 webview 播放 youtube 视频 str
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android:让用户从图库中选择图像或视频

    是否可以以这样的方式启动图库 以便同时显示图片和视频 Thanks 从图库中选择音频文件 Use MediaStore Audio Media EXTERNAL CONTENT URI Intent intent new Intent In
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 如何编写 adb jdwp + adbforward 脚本?

    我正在尝试使用命令行和脚本工具调试 Android 应用程序 我已经受够了 Android Studio 占用我的 CPU 要连接到我的应用程序 我需要adb jdwp获取 pid 然后adb forward tcp 8700 jdwp
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • android device.getUuids 返回 null

    我正在尝试使用低功耗蓝牙 BLE 通过 Android 应用程序连接到 Arduino Uno 我正在 Android Studio 上进行开发 使用 Samsung Galaxy S4 和 Android 版本 5 0 1 进行测试我点击
  • 为什么 Android 上的免安装应用有两种设置?

    我使用的是运行 Android 11 的 Pixel 3 我发现有 2 种不同的设置可以控制免安装应用的某些方面 设置 应用程序和通知 默认应用程序 打开链接 即时应用程序 即使未安装 也打开应用程序中的链接 切换默认为开 Google P
  • 如何更改蜂窝中儿童偏好屏幕的背景颜色

    过去几天我一直在寻找解决方案 但找不到 我需要更改右窗格的背景颜色 我知道如何更改左父首选项的颜色 我在清单文件中创建了一个新主题
  • 安卓独立包

    我有一个很大的 UI 大约 20 25 个屏幕 我应该如何组织我的代码 我应该按功能分成不同的包吗 我是否应该为所有 UI 类创建一个包 然后创建子包进行组织 或者我不应该创建单独的包并组织到文件夹中 任何帮助将不胜感激 当您创建文件夹时
  • 如何根据受保护的 String doInBackground 方法中 AsyncTask 的结果调用 Toast.makeText() ?

    我从 AsyncTask 中的数据库中获取数据 如果它为空 我想吐司一个警告文本 我在 AsyncTask 中尝试过 但我了解到它不是在工作线程中调用的 这是我的 doInBackground 方法 protected String doI
  • 找不到与给定名称“@style/Theme.AppCompat.Light”匹配的资源

    我已经研究这个问题几个小时了 从 github 下载存储库后 任何 xml 文件中的唯一错误是 No resource found that matches the given name style Theme AppCompat Ligh

随机推荐

  • [python]numpy 中的@运算

    运算其实等价于矩阵乘法 r location s y l location r location 1 np dot s y l location 与上面式子等价
  • java 保留字符串数字的位数,不够前面补0

    Test public void test this printToConsole autoGenericCode 10011 this printToConsole autoGenericCode 000 3 不够位数的在前面补0 保留c
  • 数模笔记——论文写作

    论文写作 各模块写作要点 数学建模论文的重要性 数学建模论文的写作是数学建模中重要的一个环节 数学建模的论文是参赛队工作的全面总结 也是评委评价建模成绩的主要依据 一篇好的论文应该逻辑清晰 在语言表述上清楚 数学符号标记清晰 对于读者或者评
  • 学习JavaScript以及React技术报告

    在学习JS中遇到的一些问题总结 1 我们需要在页面加载时能够通过javascript去动态操作html中的一些对象 对于这些操作 我们最好是在body中定义onload操作 然后在该操作中去完成这些任务 尽量避免在html中嵌入script
  • 操作系统课程设计3_系统调用

    一 实验目的 1 学习怎样重新编译 Linux 内核 2 理解 掌握 Linux 标准内核和发行版本内核的区别 二 实验内容 1 通过重新编译Linux来实现系统调用 2 通过增加模块来实现系统调用 三 实验步骤和结果 一 通过重新编译内核
  • Voting【Codeforces 1251 E1 && E2】【贪心】

    Educational Codeforces Round 75 Rated for Div 2 E2 Now elections are held in Berland and you want to win them More preci
  • Huawei Cloud EulerOS(Linux)常用命令汇总

    更改主机名称 hostnamectl set hostname
  • SLF4J简介与使用(整合log4j)

    一 概念 SLF4J的全称是Simple Logging Facade for Java 即简单日志门面 SLF4J并不是具体的日志框架 而是作为一个简单门面服务于各类日志框架 如java util logging logback和log4
  • C++ STL 迭代器方法 之 advance与prev 方法 浅析

    摘要 迭代器是STL中重要的一支 prev和distance是其基本方法 distance方法十分简单 就不在此赘述 现主要对prev方法以及其相关方法 advance方法作简要介绍与使用说明 并在文末附上代码示例 Advance 方法 A
  • R语言编程 R语言作业

    一 40 分 请使用 nycflight13 回答以下问题 1 请用 flights 表单找出出发时间没有延误 但是到达时间的所有航班 2 在 1 数据的基础上计算到达每个目的地的航班数量 平均飞行距离和平 均到达延误时间 3 在 2 的基
  • 自然语言处理(NLP)学习笔记——RNN模型

    一 RNN架构解析 1 认识RNN模型 1 1 什么是RNN模型 RNN Recurrent Neural Network 中文称作循环神经网络 它一般以序列数据为输入 通过网络内部的结构设计有效捕捉序列之间的关系特征 一般也是以序列形式进
  • J2EE的体系架构——J2EE

    J2EE是Java2平台企业版 Java 2 Platform Enterprise Edition 它的核心是一组技术规范与指南 提供基于组件的方式来设计 开发 组装和部署企业应用 J2EE使用多层分布式的应用模型 J2EE分层 客户层
  • 电脑输入英文字符的时候字体突然变了样

    问题描述 电脑输入英文字符的时候 突然变成了粗粗的还有间隙 如下所示 与正常对比 te bie pang de zi fu 出现原因 可能是因为无意间按到了中文的全半角切换 快捷键 可以把这个快捷键关掉 也可以不关 解决办法 解决这个问题的
  • Linux系统上安装docker

    文章目录 一 Docker的简介 二 Docker的组成部分 三 Docker的安装命令 安装之前先卸载系统上原有的Docker 安装需要的安装包yum utils 设置镜像仓库地址 安装docker相关的引擎 安装docker 启动doc
  • python打包列表文件到一个包

    python打包列表文件到一个包 def tar file tarfile list ret os system tar pzcvf x tar gz s join tarfile list if ret 0 return True els
  • 【机器学习 - 1】:knn算法

    文章目录 机器学习的概念和基础 knn算法的实现过程 封装knn算法 总结 机器学习的概念和基础 机器学习可以两类任务 分类任务和回归任务 以机器学习本身来进行分类可分为 监督学习 非监督学习 半监督学习 增强学习 监督学习 给机器的训练数
  • 绿幕换背景、绿幕视频实时换背景

    PS 陆陆续续做绿幕抠图相关的工作也有2年之久了 一直研究普通摄像头下的绿幕抠图工作 这样的工作要比摄影棚下的难度要高很多 当然现在也出来很多的工具 抠图算法也越来越成熟 本人较懒 后面会一点点的把相关内容补齐 先上图 上面是效果 边缘做的
  • 卷积核(又叫filter,neuron),设计CNN layers的技巧

    loss entropy求导 为0 那么该怎样求导呢 并行计算 视频 https www bilibili com video BV1Ht411g7Ef p 13 CNN的术语 共享参数 第二种版本解释CNN 前一个64个filter 通过
  • freeswitch六、freeswitch会议功能

    freeswitch默认的会议号 FreeSwitch 默认支持会议功能 有如下特点 1 不需要创建一个会议室的操作 只需要通过 conference 拨码计划就可以实现 2 会议室不真正存在 直到有人呼入为止 3 会议功能很强大 能实现灵
  • 【AOSP】Settings应用界面逻辑

    源码参考 AOSPXRef 现象效果 调试UI显示 Settings应用子界面Activity绝大部分都是SubSetting 通过dumpsys指令查看当前活动 adb shell dumpsys activity activities