功能描述
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&折叠屏相关文档
oppo easygo开发文档
oppo embedding开发文档
荣耀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
折叠屏适配金标联盟
三星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那么多,稳定性差点,比如平行视界多进程时,进程间跳转容易跳不回原来的进程直接退回桌面。
3263

被折叠的 条评论
为什么被折叠?



