解锁系统设置新姿势:Activity嵌入全解析

张开发
2026/4/18 18:40:11 15 分钟阅读

分享文章

解锁系统设置新姿势:Activity嵌入全解析
解锁系统设置新姿势Activity嵌入全解析嵌入式 Activity大屏设备的专属优化嵌入式 Activity 可是安卓高版本专门为大屏设备准备的 “秘密武器”是一种超厉害的显示模式。它能把应用的一个任务窗口巧妙地拆分到两个 activity 中甚至是同一个 activity 的两个实例里就像是把一个大任务巧妙地分成了几个小任务各自在不同的 “小舞台” 上表演 从而让大屏设备上的应用体验变得超棒而且系统还特别贴心会自动照顾小屏幕设备的感受完全不用担心在小屏幕上会 “水土不服”。当我们的应用运行在小屏幕设备上时activity 就像一群亲密的小伙伴一个叠在另一个上面有序地排列着而一旦切换到大屏幕设备它们就像变魔术一样并排站在一起展示出更加丰富和高效的界面布局。系统就像一个聪明的指挥官会根据我们提前创建好的配置自动决定 activity 的呈现方式完全不需要我们再去编写复杂的分支逻辑是不是超省心不仅如此嵌入式 Activity 还超级灵活它能够完美支持设备屏幕方向的变化。不管你是把平板横过来还是竖过去它都能迅速做出调整让界面始终保持最佳的显示效果。在可折叠设备上它更是如鱼得水当设备折叠时activity 会自动堆叠起来就像收起的书本一样而当设备展开时它们又会迅速展开并排显示整个过程无缝衔接流畅得让人惊叹极大地提升了大屏设备上的交互效率和视觉体验。为什么要在系统设置中使用 Activity 嵌入你可能会好奇为什么一定要在系统设置中使用 Activity 嵌入呢其实这背后有着诸多好处。在大屏设备上比如平板电脑、可折叠设备以及 ChromeOS 设备 用户对于高效操作和信息展示有着更高的期待。Activity 嵌入就像是给这些设备量身定制的 “秘密武器”能让应用的多个 activity 并排显示就像在一个大舞台上不同的演员activity可以同时尽情表演。这样一来用户可以在同一时间看到更多的设置选项比如在设置网络连接时不用来回切换页面就能同时查看已连接的网络和可用的网络列表操作更加便捷高效大大提升了用户体验。而且Activity 嵌入几乎不需要对现有的代码进行大规模重构就像是给旧房子进行简单装修就能焕然一新。开发者只需要创建 XML 配置文件或者调用 Jetpack WindowManager API就能轻松决定 activity 的显示方式是并排展示还是堆叠排列就像决定家具如何摆放一样简单。系统还非常智能会自动照顾小屏幕设备在小屏幕上activity 会像亲密的小伙伴一样有序地堆叠在一起完美适配小屏幕的空间。Activity 嵌入还支持设备屏幕方向的自由变化不管你是把平板横过来玩游戏还是竖起来看视频它都能迅速做出调整确保设置界面始终保持最佳的显示效果就像一个贴心的小助手时刻关注着你的使用习惯 。在可折叠设备上当设备折叠时activity 会自动堆叠就像收起的书本一样紧凑而当设备展开时它们又会迅速展开并排显示整个过程无缝衔接流畅得让人惊叹。Activity 嵌入的实现步骤一库引用要实现 Activity 嵌入首先得在 settings 目录下的 Android.bp 文件中引用 window 库 。就好像搭建房子需要先准备好各种建筑材料一样这个库就是我们实现 Activity 嵌入必不可少的 “材料”。在 Android.bp 文件中我们可以看到这样的代码android_library { name: Settings-core, //lib的名字 //.. static_libs: [ //.. androidx.window_window, //.. ] } android_app { name: Settings, //.. static_libs: [Settings-core], //引用上述lib }通过这样的配置我们就成功引入了 window 库为后续实现 Activity 嵌入打下了坚实的基础它就像房子的基石虽然看似不起眼但却至关重要。二初始化分屏规则在自定义的 application 里我们需要使用自定义工具类进行分屏规则初始化。这里涉及到两个关键的类SettingsApplication 类和 ActivityEmbeddingRulesController 类。在 SettingsApplication 类中代码如下publicclassSettingsApplicationextendsApplication{OverridepublicvoidonCreate(){super.onCreate();finalActivityEmbeddingRulesControllercontrollernewActivityEmbeddingRulesController(this);controller.initRules();}}这段代码就像是一个指挥官在应用启动时它会创建一个 ActivityEmbeddingRulesController 实例并调用其 initRules 方法开启分屏规则初始化的 “旅程”。而 ActivityEmbeddingRulesController 类则负责具体的规则控制它的构造函数如下publicActivityEmbeddingRulesController(Contextcontext){mContextcontext;mRuleControllerRuleController.getInstance(context);}在这里它获取了上下文和规则控制器实例就像找到了自己的 “伙伴”一起为分屏规则的初始化努力。三判断是否支持分屏接下来我们要判断系统是否支持分屏。这一步非常关键就像出门前要看看天气是否适合出行一样。通过下面的代码可以实现publicstaticbooleanisEmbeddingActivityEnabled(Contextcontext){//这个是配置里的设定finalbooleanisFlagEnabledFeatureFlagUtils.isEnabled(context,FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);//这个是判断系统是否支持分屏finalbooleanisSplitSupportedSplitController.getInstance(context).isSplitSupported();returnisFlagEnabledisSplitSupported;}这段代码首先通过 FeatureFlagUtils.isEnabled 方法检查配置中是否启用了相关功能标志就像检查开关是否打开然后通过 SplitController.getInstance (context).isSplitSupported 方法判断系统是否支持分屏只有当这两个条件都满足时才会返回 true表示系统支持分屏我们就可以放心地进行后续的分屏操作啦。四设置占位 activity 和全屏页面规则设置主页占位 activity我们可以使用 registerHomepagePlaceholderRule 方法 。在这个方法中我们首先创建一个 ActivityFilter 集合就像准备一个 “篮子”用来装需要设置占位 activity 的主屏类finalSetActivityFilteractivityFiltersnewHashSet();addActivityFilter(activityFilters,SettingsHomepageActivity.class);addActivityFilter(activityFilters,Settings.class);然后我们创建一个 Intent指定占位 activity也就是右侧默认显示的页面finalIntentintentnewIntent(mContext,Settings.NetworkDashboardActivity.class);intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE,true);接着我们设置分屏属性比如分屏比例等SplitAttributesattributesnewSplitAttributes.Builder().setSplitType(SplitAttributes.SplitType.ratio(ActivityEmbeddingUtils.getSplitRatio(mContext)))//0.3636.build();最后我们使用 SplitPlaceholderRule.Builder 构建一个规则并添加到规则控制器中finalSplitPlaceholderRuleplaceholderRulenewSplitPlaceholderRule.Builder(activityFilters,intent).setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()).setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()).setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ALWAYS_ALLOW).setSticky(false).setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT).setDefaultSplitAttributes(attributes).build();mRuleController.addRule(placeholderRule);这样我们就成功设置了主页占位 activity让大屏设备的主页展示更加合理。指定全屏显示页面我们可以使用 registerAlwaysExpandRule 方法 。在这个方法中首先创建一个 ActivityFilter 集合finalSetActivityFilteractivityFiltersnewHashSet();然后根据配置判断是否需要将搜索页设置为全屏显示if(FeatureFlagUtils.isEnabled(mContext,FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)){//搜索页}如果满足条件就将搜索页相关的 ActivityFilter 添加到集合中后续通过规则控制器将其设置为全屏显示。通过这样的设置我们可以让一些特定的页面在大屏设备上以全屏的方式展示提供更好的用户体验 。常见问题与解决方案在实现 Activity 嵌入的过程中难免会遇到一些问题别担心下面就为大家列举一些常见问题及解决方案。配置错误配置错误是最容易出现的问题之一。比如在引用 window 库时如果路径写错或者库的版本不兼容就会导致后续的功能无法正常实现 。就像搭积木时如果把积木放错了位置整个结构就会不稳定。解决方案是仔细检查配置文件中的路径和库的版本确保它们与项目的要求一致就像重新检查积木的摆放位置让它们严丝合缝。在设置分屏规则时各种参数的设置也非常关键如果设置不当可能会导致分屏效果不理想。这时候需要参考官方文档了解每个参数的含义和作用根据实际需求进行调整就像按照说明书搭建积木确保每个部件都在正确的位置 。兼容性问题不同的设备和系统版本对 Activity 嵌入的支持程度可能会有所不同这就可能导致兼容性问题。比如某些旧版本的系统可能不支持最新的 Activity 嵌入特性就像老房子可能无法安装最新的智能设备。为了解决这个问题我们可以在代码中添加版本检查根据不同的系统版本采取不同的策略。例如对于不支持分屏的旧版本系统直接隐藏相关的分屏功能避免出现异常就像给老房子安装适合它的普通设备而不是强行安装智能设备 。同时在开发过程中要多在不同的设备和系统版本上进行测试及时发现并解决兼容性问题确保应用在各种环境下都能稳定运行就像在不同的场地测试搭建好的积木结构确保它的稳定性 。页面显示异常有时候我们可能会遇到页面显示异常的情况比如分屏后的页面布局混乱元素重叠等 。这可能是由于布局文件中的属性设置不合理或者在代码中对页面的初始化和更新操作出现了问题。解决这个问题需要仔细检查布局文件确保各个元素的大小、位置和排列方式都符合预期就像检查积木搭建的模型确保每个积木的位置都恰到好处。同时在代码中要注意正确地处理页面的生命周期和事件响应避免在不恰当的时候对页面进行修改导致显示异常就像按照正确的顺序操作积木避免打乱搭建好的结构 。实际案例展示为了让大家更直观地感受 Activity 嵌入在系统设置中的魅力我们来看两个实际案例。案例一某知名平板电脑的系统设置某知名品牌的平板电脑在运行基于安卓高版本的系统时就巧妙地运用了 Activity 嵌入技术 。在其系统设置中当用户打开设置应用时主页面和详细设置页面会并排显示。比如在设置显示选项时用户在左侧主页面点击 “显示” 选项后右侧会立即显示出亮度调节、屏幕分辨率、字体大小等详细设置项用户可以一边查看设置分类一边调整具体参数无需频繁切换页面操作效率大幅提升。据用户反馈这种设置方式让他们在进行系统设置时速度比之前快了近 30%而且操作更加流畅和自然大大提升了用户对平板电脑系统的满意度 。案例二可折叠设备的系统设置一款热门的可折叠设备在系统设置中也采用了 Activity 嵌入 。当设备处于折叠状态时设置页面就像普通手机一样以堆叠的方式展示而当设备展开后设置页面会自动切换为分屏模式不同层级的设置页面并排显示。例如在设置网络和蓝牙时用户可以在同一屏幕上同时操作网络连接和蓝牙设备配对方便快捷。开发者表示采用 Activity 嵌入技术后虽然开发过程中增加了一些配置工作但整体代码改动不大却为用户带来了截然不同的大屏设置体验用户对设备系统设置的好评率也提高了 20%充分证明了 Activity 嵌入技术的价值 。

更多文章