Android 11 Settings源码入门,我就不信你还听不明白了

2023-05-16

前言

曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。

在工作初期,工作主要是按照业务需求实现App页面的功能,按照设计师的设计稿实现页面的效果。

在实现的过程中,总是会被提如下的需求:

这个字能不能大点或者醒目点儿?
颜感觉颜色和设计稿有差别,能不能再调调?
怎么老是崩溃啊,行不行啊?

所以,工作过一年后你会发现,自己的工作重点就是**将找各种各样的组件、框架,拖拖拽拽,改改样式。**在极端情况下出现了问题后(比如部分机型上崩溃,加载图片慢),也不知道该如何解决!都不好意思说自己是搞技术的。

造成这种局面的有两种原因:

  1. 所开发的App功能要求并不复杂,在性能上呢,也不需要极致的追求;
  2. 自己的意识不够,不知道如何从平凡的工作中提炼可优化的点,在向上提升方面也没有完整的规划

二,系统设置其他界面

系统设置中除了.homepage.SettingsHomepageActivity,其他大部分的Activity都定义在Settings中, 并且继承自SettingsActivity, 但其中并没有实现任何逻辑。因此,这些Activity的逻辑都是在SettingsActivity中实现。

/**

  • Top-level Settings activity
    */
    public class Settings extends SettingsActivity {

/*

  • Settings subclasses for launching independently.
    /
    public static class AssistGestureSettingsActivity extends SettingsActivity { /
    empty /}
    public static class BluetoothSettingsActivity extends SettingsActivity { /
    empty / }
    public static class CreateShortcutActivity extends SettingsActivity { /
    empty / }
    public static class FaceSettingsActivity extends SettingsActivity { /
    empty / }
    public static class FingerprintSettingsActivity extends SettingsActivity { /
    empty */ }

    }

这些Activity中并没有实现任何逻辑,那它是怎么加载到自己应有的布局的呢?

在父类SettingsActivityonCreate()中:

@Override
protected void onCreate(Bundle savedState) {


// Should happen before any call to getIntent()
// 第一步
getMetaData();
// 第二步
final Intent intent = getIntent();
if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
}

// Getting Intent properties can only be done after the super.onCreate(…)
final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);

// 第三步
launchSettingFragment(initialFragmentName, intent);


}

跟着上面的三个步骤:

第一步

首先通过getMetaData()获取该Activity在manifest中配置的fragment, 并赋值给mFragmentClass

public static final String META_DATA_KEY_FRAGMENT_CLASS = “com.android.settings.FRAGMENT_CLASS”;

private void getMetaData() {
try {
ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
if (ai == null || ai.metaData == null) return;
mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
} catch (NameNotFoundException nnfe) {
// No recovery
Log.d(LOG_TAG, "Cannot get Metadata for: " + getComponentName().toString());
}
}

那么manifest中是怎么配置的呢?如下:

由此可知WifiInfoActivity这个Acitivity对应的fragment是:com.android.settings.wifi.WifiInfo

第二步

通过getIntent()构造包含EXTRA_SHOW_FRAGMENT的intent

public Intent getIntent() {
Intent superIntent = super.getIntent();
String startingFragment = getStartingFragmentClass(superIntent);
// This is called from super.onCreate, isMultiPane() is not yet reliable
// Do not use onIsHidingHeaders either, which relies itself on this method
if (startingFragment != null) {
Intent modIntent = new Intent(superIntent);
modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);
Bundle args = superIntent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
if (args != null) {
args = new Bundle(args);
} else {
args = new Bundle();
}
args.putParcelable(“intent”, superIntent);
modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
return modIntent;
}
return superIntent;
}

/**

  • Checks if the component name in the intent is different from the Settings class and
  • returns the class name to load as a fragment.
    */
    private String getStartingFragmentClass(Intent intent) {
    // 存在mFragmentClass则直接返回
    if (mFragmentClass != null) return mFragmentClass;

String intentClass = intent.getComponent().getClassName();
if (intentClass.equals(getClass().getName())) return null;

if (“com.android.settings.RunningServices”.equals(intentClass)
|| “com.android.settings.applications.StorageUse”.equals(intentClass)) {
// Old names of manage apps.
intentClass = ManageApplications.class.getName();
}

return intentClass;
}

这里包含了mFragmentClass为空的情况,暂时先不管。

第三步

通过launchSettingFragment()启动对应Fragment,这里的initialFragmentName参数就是第二步Intent中包含的EXTRA_SHOW_FRAGMENT参数,mFragmentClass不为空的情况下传入的就是mFragmentClass

void launchSettingFragment(String initialFragmentName, Intent intent) {
if (initialFragmentName != null) {
setTitleFromIntent(intent);

Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
switchToFragment(initialFragmentName, initialArguments, true,
mInitialTitleResId, mInitialTitle);
} else {
// Show search icon as up affordance if we are displaying the main Dashboard
mInitialTitleResId = R.string.dashboard_title;
switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
mInitialTitleResId, mInitialTitle);
}
}

switchToFragment()中将fragment添加到activity中。

/**

  • Switch to a specific Fragment with taking care of validation, Title and BackStack
    */
    private Fragment switchToFragment(String fragmentName, Bundle args, boolean validate,
    int titleResId, CharSequence title) {
    Log.d(LOG_TAG, "Switching to fragment " + fragmentName);
    if (validate && !isValidFragment(fragmentName)) {
    throw new IllegalArgumentException("Invalid fragment for this activity: "
  • fragmentName);
    }
    // 反射创建fragment
    Fragment f = Utils.getTargetFragment(this, fragmentName, args);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.main_content, f);
    if (titleResId > 0) {
    transaction.setBreadCrumbTitle(titleResId);
    } else if (title != null) {
    transaction.setBreadCrumbTitle(title);
    }
    // 提交事务
    transaction.commitAllowingStateLoss();
    getSupportFragmentManager().executePendingTransactions();
    Log.d(LOG_TAG, “Executed frag manager pendingTransactions”);
    return f;
    }

三,数据控制

在首页-电池设置项中可以显示实时电量。那么它是如果实现的呢?

首先看下它是如何配置的:

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-yRibLnMc-1649748369942)]

Android开发不会这些?如何面试拿高薪!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 11 Settings源码入门,我就不信你还听不明白了 的相关文章

  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • 以编程方式将文本颜色设置为主要 Android 文本视图

    如何设置我的文本颜色TextView to android textColorPrimary以编程方式 我已经尝试了下面的代码 但它将 textColorPrimary 和 textColorPrimary Inverse 的文本颜色始终设
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 从应用程序启动 iPhone 设置屏幕?

    我正在开发一个应用程序 我希望按下按钮时 iPhone 设置屏幕应该打开 苹果有访问限制吗 到底能不能 如果能的话怎么办 不 你不能那样做 但是 作为替代方案 您可以使用这个框架 http www inappsettingskit com
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • 如何用python连接Linux服务器

    1 安装paramiko库 pip install paramiko 2 使用paramiko库连接linux 导入库 import paramiko 创建一个sshclient对象 ssh 61 paramiko SSHClient 允许
  • 包装类

    注意点 包装类是final的类 包装类对象是不变的 与字符串类似 不变模式 共有8种包装类 int Integer long Long byte Byte short Short float Float double Double bool
  • 数据库和缓存如何保证一致性?

    先更新数据库 xff0c 还是先更新缓存 xff1f 有了这个想法后 xff0c 就准备开始着手优化服务器 xff0c 但是挡在在他前面的是这样的一个问题 由于引入了缓存 xff0c 那么在数据更新时 xff0c 不仅要更新数据库 xff0
  • 一名高级的Javaer,应该了解的 MYSQL 高级知识点

    SQL查询流程 1 通过客户端 服务器通信协议与 MySQL 建立连接2 查询缓存 xff0c 这是 MySQL 的一个可优化查询的地方 xff0c 如果开启了 Query Cache 且在查询缓存过程中查 询到完全相同的 SQL 语句 x
  • Python循环语句

    1 for循环 1 for in range xff08 xff09 简单的for循环代码 xff1a for i in range 5 print i 输出的便是0 4形成一列 xff0c 这里rang xff08 5 xff09 xff
  • 【Android自定义注解】BindView

    注意 xff1a 定义的控件变量必须是public xff0c 否则报错 1 添加类 package com example zhujie import java lang annotation Retention import java
  • 数据可视化——(提示框插件)

    提示框插件有很多 xff0c 不同的框架中选择的也不一样 本文主要分享toastr插件总结它的使用步骤如下 xff1a 使用步骤 xff1a 加载 jqury js toastr css 和 toastr js 文件 全局配置 为方便 xf
  • 文章五:Python 网络爬虫实战:使用 Beautiful Soup 和 Requests 抓取网页数据

    一 简介 本篇文章将介绍如何使用 Python 编写一个简单的网络爬虫 xff0c 从网页中提取有用的数据 我们将通过以下几个部分展开本文的内容 xff1a 网络爬虫的基本概念Beautiful Soup 和 Requests 库简介选择一
  • Android Studio编译无错,但在模拟器上无法运行App

    今天在学习郭霖老师的 第一行代码 第三版时碰到一个问题 xff0c 明明运行无错 xff0c 却无法在模拟器上正常运行 一开始提示说 Waiting for all target devices to come online xff0c 在
  • 突破CloudFlare五秒盾付费版

    使用的第三方库 cloudscraper 可以绕过免费版的五秒盾 但遇到付费版就无能为力了 最近在爬币圈的网站 xff0c 其中有一个网站叫做 xff1a Codebase 1 使用的就是付费版的 CloudFlare 五秒盾 当我们使用
  • CentOS-7 配置 SSH 远程登录

    CentOS 7 配置 SSH 远程登录 CentOS 配置 SSH 远程登录一 环境二 配置网络1 检查网络状态2 下载 net tools 工具3 检查主机与虚拟机是否正常连通 三 SSH 配置1 检查 CentOS 系统是否已经安装了
  • Linux中如何使用systemctl进行服务的管理?

    一 运行级别的分类 runlevel 运行级别0 xff1a 系统停机状态 运行级别1 xff1a 单用户工作状态 xff0c root权限 xff0c 用于系统维护 xff0c 禁止远程登陆 运行级别2 xff1a 多用户状态 没有NFS
  • Hibernate的配置

    Hibernate 的配置 1 创建工程 xff1b 2 导入 Jar 包 xff1b 3 写 Hibernate 配置文件 xff08 hibernate cfg xml xff09 a 数据库连接信息 b 映射文件包含配置 4 创建表和
  • vue3 axios

    Axios 是一个基于 promise 网络请求库 xff0c 作用于node js 和浏览器中 简介 Axios 是一个用于浏览器和Node的基于承诺的简单HTTP客户端 它提供了一个易于使用的库 xff0c 占地面积小 它还有一个可扩展
  • Linux系统四种安软方式

    Linux软件安装方式 本地安装 把需要的软件压缩包下载到linux主机 xff0c 在主机上直接解压启动即可完成本地安装 xff0c 即绿色版安装 把需要的rpm软件包下载到linux主机 xff0c 在主机上使用rpm命令完成本地安装
  • 关于vscode安装扩展插件提示:获取扩展失败,XHR error

    在我们安装vscode扩展插件时 xff0c 出现报错 xff1a error while fetching extensions XHR error 搜了很多网友的解决方案 xff0c 比如修改网络代理设置 xff0c 修改hosts文件
  • simulink模块,提供xpctarget下驱动源码

    simulink模块 xff0c 提供xpctarget下驱动源码 77999632700099250风中的蜗牛
  • SQL SERVER创建字段注释

    第一种方法是用SQL SERVER的管理工具 表设计中的列属性自带说明 xff0c 填写会自动生成注释 第二种方法 如果在navicat等工具上无法可视化创建注释的 xff0c 需要执行语句 EXEC sys sp addextendedp
  • Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名

    您好 xff0c 欢迎关注我的专栏 xff0c 本篇文章是关于 Flutter 的系列文 xff0c 从简单的 Flutter 介绍开始 xff0c 一步步带你了解进入 Flutter 的世界 你最好有一定的移动开发经验 xff0c 如果没
  • Android 11 Settings源码入门,我就不信你还听不明白了

    前言 曾听过很多人说Android学习很简单 xff0c 做个App就上手了 xff0c 工作机会多 xff0c 毕业后也比较容易找工作 这种观点可能是很多Android开发者最开始入行的原因之一 在工作初期 xff0c 工作主要是按照业务