Android7.0 多窗口你值得拥有

时间:2022-02-09 10:09:05

Android7.0 多窗口你值得拥有

  • 什么是多窗口分屏?

    多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了“分屏多任务”和”APP窗口化”功能,但这些都是手机厂商自主定制系统中添加的功能,并非安卓原生所有,因此他们的实现方式可能会不一样,但是现在google原始开始支持,这样对厂商来说也有了标准,对体验和性能上也会比较好.

  • 多窗口解决什么问题(平板适配问题).

    一些android app没经过适配,在平板上安装,会导致布局分散,用户体验很差,现在7.0对的分屏正好也是解决这个问题.

其实Android原生6.0也有自带分屏.

其实android6.0就考虑到了这个需求,不过需要先把机子root,修改系统内的一个权限.

那么如何去激活这个隐藏的必杀技呢,看下面的步骤.

激活6.0多窗口支持操作步骤:

1. root

2. 用RE文件管理器打开system/build.prop找到ro.build.type这一行,

把=号后面的user改成userdebug,保存后重启.

3. 重启后,在系统设置进入开发者选项.

4. 找到“多窗口模式”,激活功能即可.

由于该功能属于测试阶段,运行可能会导致一些异常奔溃,

所以建议备份下资料.

Android7.0 多窗口你值得拥有

在7.0版本时我们如何去实现多窗口呢?

Android N 添加了对同时显示多个应用窗口的支持。 在手持设备上,两个应用可以在分屏模式中左右并排或上下并排显示。

如果您使用 N Preview SDK 构建应用,则可以配置应用处理多窗口显示的方法。 例如,您可以指定 Activity 的最小允许尺寸。 您还可以禁用应用的多窗口显示,确保系统仅以全屏模式显示应用。

预览下效果

- 在Android N设备中,系统可以对支持分屏的应用进行,横竖分屏,中间的分割线可以放大其中一个应用,对应缩小另一个应用.

Android7.0 多窗口你值得拥有

如何切换到分屏模式?

- 方法一

打开OverView 屏幕,长按 Activity 标题,则可以拖动该 Activity 至屏幕突出显示的区域,

使 Activity 进入多窗口模式.

Android7.0 多窗口你值得拥有

  • 方法二

    如该应用支持分屏模式且属于显示状态情况下,不必进入OverView 屏幕,可以通过长按OverView按钮直接进入分屏.

给wm 应用配置分屏模式

在清单文件的 或 节点中设置该属性,启用或禁用多窗口显示:

//设置为true ,该activity支持分屏,默认为true
android:resizeableActivity="true"

AndroidManifest中的布局属性

对于 Android N,<layout> 清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为,我们先看看下面的代码.


<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end"
          android:minimalSize="450dp" />
</activity>

这些布局属性会对多窗口带来什么影响呢?看看下面.

android:defaultWidth

以*形状模式启动时 Activity 的默认宽度。

android:defaultHeight

以*形状模式启动时 Activity 的默认高度。

android:gravity

以*形状模式启动时 Activity 的初始位置。

android:minimalSize

分屏和*形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。

例如,以下节点显示了如何指定 Activity 在*形状模式中显示时 Activity 的默认大小、位置和最小尺寸:

不同的配置下,效果会不一样

    1. 如何设置禁止分屏.

      在AndroidManifest中配置UnresizableActivity的unresizable属性.

      在这添加FLAG_ACTIVITY_NEW_TASK 标签开启新的任务栈,是为了避免其继承根activity的属性,比如在根activity设置了尺寸大小的话,其不设置标签属性会被继承.
Intent intent = new Intent(this, UnresizableActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

清单xml中配置unresizable属性.

<activity
android:name="com.android.multiwindowplayground.activities.UnresizableActivity"
android:resizeableActivity="false"
android:taskAffinity="" />
    1. 设置以最小尺寸方式开启分屏

      在AndroidManifest中配置MinimumSizeActivity的默认尺寸,最小尺寸,
 startActivity(new Intent(this, MinimumSizeActivity.class));

清单xml中配置unresizable属性.

   <activity
            android:name="com.android.multiwindowplayground.activities.MinimumSizeActivity"
            android:launchMode="singleInstance"
            android:taskAffinity="">
            <layout
                android:defaultHeight="500dp"
                android:defaultWidth="750dp"
                android:gravity="top|end"
                android:minimalWidth="500dp"
                android:minimalHeight="500dp" />
        </activity>
    1. AndroidManifest 配置Configuration的参数会有什影响?

      activity中AndroidManifest 配置Configuration的参数,会影响到分屏.
<activity
        android:name=".CustomConfigurationChangeActivity"
        android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
        android:launchMode="singleInstance"
        android:taskAffinity=""/>

如果上面配置的参数有所变化,我们可以在onConfigurationChanged()方法中监听到.

如下:

//重写Activity中的onConfigurationChanged方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT)   {
  //TODO 竖屏,需要处理的事情
}   

if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE)   {
//TODO 横屏,需要处理的事情
}   

   super.onConfigurationChanged(newConfig);
}   

注意: 可能会监听不了参数的变化,别忘记加上权限

<uses-permission Android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

如何处理设备配置带来的运行变化

有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy()onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。

首先这个变化的过程是这样的,如果你没有在activity的属性中配置’android:configChanges=”keyboardHidden| orientation’那么默认是会走横竖屏的,也就是说会走,销毁Activity->创建Activity.

由于重启整个Activity,如果数据量比较大的情况下,用户体验会十分差(例如网络请求,复杂View的绘制,动画的渲染等),所以解决这种体验我们可以通过下面两种方式:

- 通过onSaveInstanceState()onRestoreInstanceState()保存变动前的对象.

Android 会在销毁 Activity 之前调用 onSaveInstanceState(),以便您保存有关应用状态的数据。 然后,您可以在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态。

  • 通过`android:configChanges=”keyboardHidden| orientation’禁止横竖屏切换.

    阻止系统在某些配置变更期间重启 Activity,但要在配置确实发生变化时接收回调(具体回调上面有代码),这样,您就能够根据需要手动更新 Activity。

多窗口的生命周期

除了知道上面的不同的配置下,效果会不一样之外,我们是不是还要注意一个问题,我们知道Activity的横竖屏会影响它的生命周期,那么对于多窗口来说,是否也会有这样的影响呢?

下面是Goodle官方的说明.

在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为* Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的* Activity 将暂停。

注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复onStart() 中的视频播放。

也就是说多窗口模式不会更改Activity的生命周期,但是在对一些需要使用到onPause()方法的为了更好体验,需要做小变动.

更多详情