安卓demo-折叠屏平行视界适配(embedding方案)
功能描述
2个活动页左右分屏展示。可适配的厂商有:华为/vivo/oppo/荣耀/三星/小米。大部分安卓系统都支持embedding。
步骤
1、添加em依赖的WindowManager包,目前官方稳定版是window1.3
implementation('androidx.window:window:1.3.0')2、使用jetpack startup库在加载应用的其他组件和启动activity之前执行初始化。这里使用startup加载em配置文件
implementation('androidx.startup:startup-runtime:1.2.0')3、配置分屏规则main_split_config.xml,将其放到res/xml目录下
<!-- main_split_config.xml --> <resources xmlns:window="http://schemas.android.com/apk/res-auto"> <!-- Define a split for the named activities. --> <SplitPairRule window:clearTop="true" window:splitMinWidthDp="600" window:splitRatio="0.5"> <SplitPairFilter window:primaryActivityName=".MainActivity" window:secondaryActivityName=".AActivity" /> <SplitPairFilter window:primaryActivityName=".MainActivity" window:secondaryActivityName="*" /> </SplitPairRule> <!-- Specify a placeholder for the secondary container when content is not available. --> <SplitPlaceholderRule window:placeholderActivityName=".PlaceholderActivity" window:splitMinWidthDp="600" window:splitRatio="0.33"> <ActivityFilter window:activityName=".PlaceholderActivity" /> </SplitPlaceholderRule> <!-- Define activities that should never be part of a split. Note: Takes precedence over other split rules for the activity named in the rule. --> <ActivityRule window:alwaysExpand="true"> <ActivityFilter window:activityName=".FullActivity" /> </ActivityRule> </resources>4、创建分屏启动类去加载xml分屏配置文件main_split_config.xml
package com.lwj.embeddingtest; import android.content.Context; import android.util.Log; import androidx.annotation.NonNull; import androidx.startup.Initializer; import androidx.window.embedding.RuleController; import androidx.window.embedding.SplitController; import java.util.Collections; import java.util.List; public class SplitWindowInitializer implements Initializer<RuleController> { private static final String TAG = "SplitWindowInitializer"; @NonNull @Override public RuleController create(@NonNull Context context) { Log.d(TAG, "create: is support embedding = " + SplitController.getInstance(context).getSplitSupportStatus()); RuleController ruleController = RuleController.getInstance(context); ruleController.setRules(RuleController.parseRules(context, getResId(context, "xml", "main_split_config"))); return ruleController; } @NonNull @Override public List<Class<? extends Initializer<?>>> dependencies() { return Collections.emptyList(); } public static int getResId(Context context, String type, String name) { return context.getResources().getIdentifier(name, type, context.getPackageName()); } }5、在应用的AndroidManifest.xml里面增加provider在应用创建的时候去调分屏启动类加载xml分屏相关配置信息
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" android:multiprocess="true" tools:node="merge"> <meta-data android:name="com.lwj.embeddingtest.SplitWindowInitializer" android:value="androidx.startup" /> </provider>6、在应用的AndroidManifest.xml里面增加一些其他embedding配置
<meta-data android:name="embedded" android:value="true" /> <property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED" android:value="true" /> <!-- 允许系统 activity 嵌入--> <property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE" android:value="true" />状态监听&获取
可通过onConfigurationChanged来监听平行视界状态变化,通过ActivityEmbeddingController.getInstance(this).isActivityEmbedded(this));来判断当前activity是否处于平行视界状态
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.d(TAG, "onConfigurationChanged: " + ActivityEmbeddingController.getInstance(this).isActivityEmbedded(this)); }效果视频
embedding分屏效果
代码
https://gitee.com/flying-guy/daily-practice/tree/master/AndroidProject/EmbeddingTest
遇到的问题
- 小米12及其以上版本不兼容easygo方案,只兼容embedding方案
- 系统设置里面没有开关打开关闭平行视界模式,适配以后startactivity屏幕尺寸够大且匹配到了就会开启分屏,没找到相关api
- easygo方案和embedding方案同时存在时可能会冲突。
vivo官网说的是需要联系关一个,vivo优先级easygo>embedding
oppo是系统根据ROM的版本优先支持原生的em,即优先级embedding>easygo
荣耀也是easygo>embedding,不过荣耀可以在xml里面增加属性配置增加em优先级
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <property android:name="com.hihonor.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_FIRST" android:value="true" /> </application> </manifest>相关官方文档
华为easygo适配文档
文档中心
vivo easygo&折叠屏相关文档
vivo开放平台
oppo easygo开发文档
OPPO 开放平台-OPPO开发者服务中心
oppo embedding开发文档
OPPO 开放平台-OPPO开发者服务中心
荣耀easygo开发文档https://developer.honor.com/cn/docs/adaptation_guide/guides/mw_adaptation_guide
荣耀embedding开发文档
https://developer.honor.com/cn/docs/adaptation_guide/guides/ae_adaptation_guide
小米embedding开发文档
文档中心
安卓官网embedding
Activity 嵌入 | Views | Android Developers
折叠屏适配金标联盟
金标联盟 | ITGSA | 移动智能终端生态联盟
三星embedding适配
三星远程开发测试平台-Activity embedding(应用内分屏)适配指导
windowx变更(embedding主要依赖windowx里面的方法,其中androidx.window:window:1.1.0-alpha02和androidx.window:window:1.3.0差异较大,现在实现的方案是使用稳定版包androidx.window:window:1.3.0)
WindowManager | Jetpack | Android Developers
easygo
easygo可参考华为官方文档,一套下来可适配华为、oppo、vivo、荣耀。不过与embedding相比,api没embedding那么多,稳定性差点,比如平行视界多进程时,进程间跳转容易跳不回原来的进程直接退回桌面。
