解锁系统设置新姿势: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 文件中,我们可以看到这样的代码:

Plain 复制代码
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 类中,代码如下:

java 复制代码
public class SettingsApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        final ActivityEmbeddingRulesController controller = new ActivityEmbeddingRulesController(this);
        controller.initRules();
    }
}

这段代码就像是一个指挥官,在应用启动时,它会创建一个 ActivityEmbeddingRulesController 实例,并调用其 initRules 方法,开启分屏规则初始化的 "旅程"。而 ActivityEmbeddingRulesController 类则负责具体的规则控制,它的构造函数如下:

java 复制代码
public ActivityEmbeddingRulesController(Context context) {
    mContext = context;
    mRuleController = RuleController.getInstance(context);
}

在这里,它获取了上下文和规则控制器实例,就像找到了自己的 "伙伴",一起为分屏规则的初始化努力。

(三)判断是否支持分屏

接下来,我们要判断系统是否支持分屏。这一步非常关键,就像出门前要看看天气是否适合出行一样。通过下面的代码可以实现:

java 复制代码
public static boolean isEmbeddingActivityEnabled(Context context) {
    //这个是配置里的设定
    final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
    //这个是判断系统是否支持分屏
    final boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported();
    return isFlagEnabled && isSplitSupported;
}

这段代码首先通过 FeatureFlagUtils.isEnabled 方法检查配置中是否启用了相关功能标志,就像检查开关是否打开;然后通过 SplitController.getInstance (context).isSplitSupported 方法判断系统是否支持分屏,只有当这两个条件都满足时,才会返回 true,表示系统支持分屏,我们就可以放心地进行后续的分屏操作啦。

(四)设置占位 activity 和全屏页面规则

设置主页占位 activity,我们可以使用 registerHomepagePlaceholderRule 方法 。在这个方法中,我们首先创建一个 ActivityFilter 集合,就像准备一个 "篮子",用来装需要设置占位 activity 的主屏类:

java 复制代码
final Set<ActivityFilter> activityFilters = new HashSet<>();
addActivityFilter(activityFilters, SettingsHomepageActivity.class);
addActivityFilter(activityFilters, Settings.class);

然后,我们创建一个 Intent,指定占位 activity,也就是右侧默认显示的页面:

java 复制代码
final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true);

接着,我们设置分屏属性,比如分屏比例等:

java 复制代码
SplitAttributes attributes = new SplitAttributes.Builder()
      .setSplitType(SplitAttributes.SplitType.ratio(ActivityEmbeddingUtils.getSplitRatio(mContext)))//0.3636
      .build();

最后,我们使用 SplitPlaceholderRule.Builder 构建一个规则,并添加到规则控制器中:

java 复制代码
final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.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 集合:

java 复制代码
final Set<ActivityFilter> activityFilters = new HashSet<>();

然后,根据配置判断是否需要将搜索页设置为全屏显示:

java 复制代码
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)) {
    //搜索页
}

如果满足条件,就将搜索页相关的 ActivityFilter 添加到集合中,后续通过规则控制器将其设置为全屏显示。通过这样的设置,我们可以让一些特定的页面在大屏设备上以全屏的方式展示,提供更好的用户体验 。

常见问题与解决方案

在实现 Activity 嵌入的过程中,难免会遇到一些问题,别担心,下面就为大家列举一些常见问题及解决方案。

配置错误

配置错误是最容易出现的问题之一。比如在引用 window 库时,如果路径写错或者库的版本不兼容,就会导致后续的功能无法正常实现 。就像搭积木时,如果把积木放错了位置,整个结构就会不稳定。解决方案是仔细检查配置文件中的路径和库的版本,确保它们与项目的要求一致,就像重新检查积木的摆放位置,让它们严丝合缝。在设置分屏规则时,各种参数的设置也非常关键,如果设置不当,可能会导致分屏效果不理想。这时候,需要参考官方文档,了解每个参数的含义和作用,根据实际需求进行调整,就像按照说明书搭建积木,确保每个部件都在正确的位置 。

兼容性问题

不同的设备和系统版本对 Activity 嵌入的支持程度可能会有所不同,这就可能导致兼容性问题。比如,某些旧版本的系统可能不支持最新的 Activity 嵌入特性,就像老房子可能无法安装最新的智能设备。为了解决这个问题,我们可以在代码中添加版本检查,根据不同的系统版本采取不同的策略。例如,对于不支持分屏的旧版本系统,直接隐藏相关的分屏功能,避免出现异常,就像给老房子安装适合它的普通设备,而不是强行安装智能设备 。同时,在开发过程中,要多在不同的设备和系统版本上进行测试,及时发现并解决兼容性问题,确保应用在各种环境下都能稳定运行,就像在不同的场地测试搭建好的积木结构,确保它的稳定性 。

页面显示异常

有时候,我们可能会遇到页面显示异常的情况,比如分屏后的页面布局混乱,元素重叠等 。这可能是由于布局文件中的属性设置不合理,或者在代码中对页面的初始化和更新操作出现了问题。解决这个问题需要仔细检查布局文件,确保各个元素的大小、位置和排列方式都符合预期,就像检查积木搭建的模型,确保每个积木的位置都恰到好处。同时,在代码中,要注意正确地处理页面的生命周期和事件响应,避免在不恰当的时候对页面进行修改,导致显示异常,就像按照正确的顺序操作积木,避免打乱搭建好的结构 。

实际案例展示

为了让大家更直观地感受 Activity 嵌入在系统设置中的魅力,我们来看两个实际案例。

案例一:某知名平板电脑的系统设置

某知名品牌的平板电脑在运行基于安卓高版本的系统时,就巧妙地运用了 Activity 嵌入技术 。在其系统设置中,当用户打开设置应用时,主页面和详细设置页面会并排显示。比如在设置显示选项时,用户在左侧主页面点击 "显示" 选项后,右侧会立即显示出亮度调节、屏幕分辨率、字体大小等详细设置项,用户可以一边查看设置分类,一边调整具体参数,无需频繁切换页面,操作效率大幅提升。据用户反馈,这种设置方式让他们在进行系统设置时,速度比之前快了近 30%,而且操作更加流畅和自然,大大提升了用户对平板电脑系统的满意度 。

案例二:可折叠设备的系统设置

一款热门的可折叠设备在系统设置中也采用了 Activity 嵌入 。当设备处于折叠状态时,设置页面就像普通手机一样,以堆叠的方式展示;而当设备展开后,设置页面会自动切换为分屏模式,不同层级的设置页面并排显示。例如,在设置网络和蓝牙时,用户可以在同一屏幕上同时操作网络连接和蓝牙设备配对,方便快捷。开发者表示,采用 Activity 嵌入技术后,虽然开发过程中增加了一些配置工作,但整体代码改动不大,却为用户带来了截然不同的大屏设置体验,用户对设备系统设置的好评率也提高了 20%,充分证明了 Activity 嵌入技术的价值 。

相关推荐
之歆2 小时前
前端存储方案对比:Cookie-Session-LocalStorage-IndexedDB
前端
哟哟耶耶2 小时前
vue3-单文件组件css功能(:deep,:slotted,:global,useCssModule,v-bind)
前端·javascript·css
是罐装可乐2 小时前
深入理解“句柄(Handle)“:从浏览器安全到文件系统访问
前端·javascript·安全
华科易迅2 小时前
Vue如何集成封装Axios
前端·javascript·vue.js
康一夏2 小时前
Next.js 13变化有多大?
前端·react·nextjs
糖炒栗子03262 小时前
前端项目标准环境搭建与启动
前端
不是az2 小时前
CSS知识点记录
前端·javascript·css
爱分享的阿Q3 小时前
GPT6-Spud-AGI前夜的豪赌
前端·easyui·agi
西西小飞龙3 小时前
Less/Sass Mixins vs. Extend
前端·less·sass