Settings开发
Preference是一个用于创建设置界面的框架,它提供了一套简单而强大的机制来存储和管理应用的配置信息。Preference库包中包含了很多种基础Preference类型。如等。同时又定义了许多用于Settings中的自定义类型,如等等。它的默认布局类型为LinearLayout,大多数情况下,可以将它理解为一个较为复杂的Button。它的显示一般借助于PreferenceFragment或者P
1. 嵌入式Activity介绍
嵌入式Activity是安卓高版本针对大屏设备的一种显示模式,可以将应用的一个任务窗口拆分到两个 activity 中,或者拆分到同一个 activity 的两个实例中,从而优化大屏设备上的应用。系统会自动维护对小屏幕的支持。当应用在配备小屏幕的设备上时,activity 会相互堆叠。在大屏幕上,activity 会并排显示。系统会根据您已创建的配置(不需要分支逻辑)来确定呈现方式。activity 嵌入支持设备屏幕方向的变化,并且可以在可折叠设备上无缝运行,该功能会随着设备折叠和展开而堆叠和取消堆叠 activity。
在Android13上可以实现跨应用嵌入:

首先,需要在AndroidManifest.xml中添加权限:
android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED

然后需要导入相关库:
AS:implementation 'androidx.window:window:1.1.0-beta02'(或者更高版本)
Androidbp: static_libs: ["androidx.window.extensions"]
一些原理框架类的源码在frameworks/base/libs/WindowManager/Jetpack/src/androidx/window/extensions/目录。
配置方式:
一般是通过xml文件进行配置:
也可以通过代码配置:
Settings的配置规则是在src/com/android/settings/activityembedding/目录,ActivityEmbeddingRulesController.java和ActivityEmbeddingUtils.java。
使用方法:
xml配置方式:RuleController.parseRules(context, R.xml.main_split_config)
代码方式:SplitPlaceholderRule.Builder构建一个规则,然后RuleController.addRule(SplitPlaceholderRule);
2. Preference介绍
Preference 是一个用于创建设置界面的框架,它提供了一套简单而强大的机制来存储和管理应用的配置信息。
Preference库包中包含了很多种基础Preference类型。如CheckBoxPreference,ListPreference等。同时SettingsLib又定义了许多用于Settings中的自定义类型,如LayoutPreference,AppPreference,ButtonPreference等等。
它的默认布局类型为LinearLayout,大多数情况下,可以将它理解为一个较为复杂的Button。
它的显示一般借助于PreferenceFragment或者PreferenceFragmentCompat。通过setPreferencesFromResource方法从xml中读取Preference列表。以下图为例,表头是以PreferenceScreen为外框架,PreferenceScreen继承自PreferenceGroup,拥有addPreference和removePreference等方法,可以负责其中Preference的调度。然后是主体架构,即具体的Preference类型,参数,属性的定义和排序。其中以"android:"开头的是原生自带的属性,"settings:"开头的基本为Settings中自定义属性。

下面以圆角背景为例,分析如何添加自定义属性,在一个Preference组中,最上方的需使用上圆角,最下方的需使用下圆角,中间部分则不需要使用圆角,那我们可以自定义一个属性,声明该Preference在这个Preference组中的位置,然后在绘制Preference的时候为其配上不同的背景就能实现该功能。

首先,我们可以在attrs.xml中找关于Preference的配置,如果没有则自己配置一个,然后定义名为"location"的属性,它的数据类型为string,然后我们就可以在配置文件中使用"settings:location"来进行声明,注意声明settings这个前置的含义,xmlns:settings="http://schemas.android.com/apk/res-auto"。

最后,我们在具体的Preference类中读取这个属性值,通过Preference的onBindViewHolder方法,为其配置不同的背景。


3. 总体框架
Settings的代码主要在两个地方:
1.packages/apps/Settings 主模块 2.frameworks/base/packages/SettingsLib 主要的依赖模块,定义了许多自定义控件及资源文件

3.frameworks/opt/net/wifi/libs/WifiTrackerLib 主要的wifi依赖模块
4.external/setupcompat 和 external/setupdesign Settings中部分页面会使用到这些模块的样式,主要是设置锁屏那一块
5.平台的附加模块:如展讯的vendor/sprd/platform/packages/apps/Settings,里面包含了平台的一些自定义功能,如定时开关机,省电管理等,通过编入Settings-core来实现依赖。

Settings的主模块框架:

tip:shortcuts就是在桌面长按应用图标弹出的几个快捷跳转


分屏模式下主界面:

主页面是SettingsHomePageActivity,子页面大多继承自SettingsBaseActivity,是一个FragmentActivity,大多数页面都继承自DashboardFragment,其他包含了复杂的继承关系,一些共性的逻辑可以在SettingsBaseActivity和DashboardFragment中修改,如Toolbar的配置,边距,背景等的调整。
4. 开发技巧
4.1 搜索屏蔽 (只适用于Settings中的部分,附属进来的模块实现方式不一定相同)
可分为两种情况,一种是屏蔽该Preference及其子页面的搜索,一种是只屏蔽Preference中词条的搜索。
以下面这个Preference为例:

只屏蔽这个Preference上的词条:直接设置settings:searchable="false"即可。
屏蔽该Preference及其子页面的搜索:需要先找到其对应的Fragment,即android:fragment的值,在DreamSettings中,复写内部类SearchIndexProvider的isPageSearchEnabled方法,加入自己的判断即可。

4.2 插入页面或者应用
也分两种方式,一种是在Settings中修改,一种是在要插入的页面上修改(拿不到Settings源码等情况)
在Settings中修改:在配置文件中配置好Preference,然后通过Intent指向要跳转的页面

在要插入的页面进行修改:在定义该页面的AndroidManifest.xml中配置相应的meta-data
开发者选项:

健康连接:

至于Settings中的页面属于哪个category,可以看下Settings中的DashboardFragmentRegistry类和SettingsLib中的CategoryKey类,也可以自己按照这种方式去添加CategoryKey。


所以当我们想要删除Settings中某个Preference时,需要先搞清楚它的添加方式。
4.3 Preference的点击事件
Preference中可能包含了一些控件,如checkbox,switch,但需要注意的是,其中的一些控件可能并不会处理点击事件,而是以Preference作为一个整体去响应事件,以带switch的SwitchPreference为例:

SwitchPreference的layout文件中对于switch配置的是不可点击。在代码中也没有为switch设置监听点击事件,我们看到的点击效果的切换,是通过SwitchPreference的监听事件来去设置switch的状态。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)