安卓-折叠屏平行视界适配(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那么多,稳定性差点,比如平行视界多进程时,进程间跳转容易跳不回原来的进程直接退回桌面。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值