文章目录
  1. 1. 建议一:使用正确的Context
  2. 2. 建议二:正确处理状态改变
  3. 3. 建议三:处理多方向
  4. 4. 建议四:建立基于支持各种屏幕尺寸的响应式UI
  5. 5. 建议五:被其他应用打开的 Activity 必须支持多窗口
  6. 6. 终极建议:多测试

如果你关注 Android N 的新特性,你可能已经发现 Android N 的新特性多窗口支持。

Android N Multi-window

通过多窗口的支持,两个不同应用可以并列显示在屏幕上。很兴奋的直接查看文档,通过查看新的API来看看它事如何工作的。

查文档发现,添加了很多新的 API。主要事一些 XML 和 Activity 的一些方法。XML 设置是否支持多窗口。Activity 中的新的方法检测当前是否在多窗口模式下。所以魔性的地方在哪里呢?其实魔性一直都在 (The magic has been there all along.)

多窗口功能最魔性的地方是资源系统。资源系统最给力的功能是可以动态调整资源,比如 dimensions、layout、drawable、menu 以及其他基于不同屏幕的属性。

多窗口利用资源系统根据屏幕大小调整配置的特性。屏幕尺寸是最明显的一个。其次还有屏幕大小改变时更新屏幕最小宽高和屏幕方向(Orientation)。

以下是兼容多窗口的五点建议:

建议一:使用正确的Context

我们需要使用正确的 Context 来加载资源。如果你使用Activity的context来infalt你的layout和检索资源等等,恭喜你,这个你做的很好。

但是,如果你使用 Application 的 context 处理任何 UI 的事情,你会发现针对多窗口它们都失效了。更严重的是,如果你不使用 Activity 的主题,你会发现家在完全错误的资源!最好办法是保证你的 UI 相关操作使用 Activity 的 context。

建议二:正确处理状态改变

通过使用正确的 context,你可以获取到针对不同屏幕尺寸的争取的资源。对资源的重新加载基于对运行时屏幕状态改变的处理

最基本的处理是 activity 的销毁和重建,恢复你保存在 onSaveInstanceState() 中的状态,重新加载资源和布局。This has the nice property that you know everything is consistent with the new configuration and that every type of configuration is handled.

任何配置的改变应该是快速和无缝的。需要保证没有在 onResume() 中处理耗时操作。考虑使用 loaders 来保证数据支持配置的改变。

在 Activity (Fragment) 中不要直接销毁和重建, 你应该在配置改变回调 onConfigurationChanged() 中手动更新 view 和加载资源等等。

想要获取多窗口配置改变,你需要在 Manifest 中添加 android:configChanges :

1
2
3
4
5
<activity
android:name=".MyActivity"
android:configChanges="screenSize|smallestScreenSize
|screenLayout|orientation"
/>

确保你处理了可能个需要改变的任何的资源。

重新加载资源可能包括之前加载的一些常量。尤其要考虑 values 和 values-sw600dp 这两种下面的 dimiension 。在不支持多窗口的时候,你从来不需要在运行时切换这两种 values,因为最小宽高是不会改变的。但是,在支持多窗口的环境下,当你的 app 的窗口尺寸发生改变,你必须要切换加载不同的资源文件。

建议三:处理多方向

是否还记得我们在屏幕大小发生改变的时候关于 Orientation 的介绍?即使设备在横屏状态,你的应用也需要处理竖屏的情况。

事实证明: protrait 状态只是高比宽大,landscape 状态是宽比高大。通过这两个定义,可以推测出当应用窗口尺寸发生该案时,你的应用可能从一种状态切换到另外一种状态。

这同样意味着,在 orientation 各状态之间转换需要尽量平滑。下面直接应用材料设置对分屏的描述

Changing a device’s orientation should not cause the UI to change unexpectedly. For example, an app displaying a video in one of the split screens (in portrait mode) should not begin playback in full-screen if the device rotates to landscape mode.

⚠️注意:如果你仍然想要使用全屏的一些特性,你需要调用 inMultiWindowMode() 方法来检查当前在那种状态。

使用 android:screenOrientation 锁定屏幕方向仍然会影响多窗口。如果你应用中设置目标版本不是 Android N ,这时设置 android:screenOrientation 意味着你的应用不支持多窗口。这也意味着强制用户使用非多窗口模式。相反,如果你设置目标版本支持 Android N ,那么在多窗口模式下,你设置的 android:screenOrientation 是不起作用的。

在 Android N 的机器上,不管你是否设置目标版本为 N ,通过使用 setRequestedOrientation() 在运行时锁定 Orientation 是没有效果的。

通过在 Manifest 中设置 Activity 的 android:immersive 属性来禁用多窗口,规则和上面 android:screenOrientation 一样。

建议四:建立基于支持各种屏幕尺寸的响应式UI

支持多窗口的设计不只有 Orientation 。多窗口肯定最新被应用在平板上。

如果你的应用是基于响应式 UI ,且在平板和手机上显示效果相似,那么你会发现你已经准备好了对多窗口特性的支持。建议你现在能做的是支持从 220dp 到屏幕全尺寸。 附原文: As suggested, scaling the UI down to 220dp wide/tall and building up from that size to the fullscreen size is a something you can do now.

Building a single responsive layout makes for smooth transitions as your app resizes

但是,如果你的手机版本和平板版本的 UI 差距很大,不要强制用户选择其一。最好支持平板 UI 的缩放。为了确保屏幕尺寸改变的用户体验平滑和流畅,你可以考虑是用响应式 UI 模式

建议五:被其他应用打开的 Activity 必须支持多窗口

在多窗口多的环境下,你的整个 task 被一个窗口代替。这也是为什么当你想要启动一个相邻的 Activity 的时候,你需要开启新的 task 和新的窗口。

反过来,如果你在一个 task 栈中启动一个 activity ,这个这个 activity 继承打开它的 activity 的所有的窗口的属性。应用原文如下:

If you launch an activity within a task stack, the activity replaces the activity on the screen, inheriting all of its multi-window properties.

这就意味着,如果你有一个 activity 允许其他应用打开, 那么你的 activity 就会继承打开他的 activity 的所有多窗口的属性。包括最小的尺寸这个属性。当处理 startActivityForResult(),即使使用的隐式的 intent ,你不能保证你的 intent 包含 FLAG_ACTIVITY_NEW_TASK 属性,你的 activity 必须要在相同的 task 栈。

因此,你的所有的 activity 需要都支持多窗口,需要都支持各种尺寸。而且还都需要测试!

终极建议:多测试

支持多窗口最好的准备是测试你的应用。一种简单的办法是不改变你现有的代码,直接安装你现在的应用到 Android N 的设备或模拟器上,即可简单方便的获取应用现存的问题。

原文地址:https://medium.com/google-developers/5-tips-for-preparing-for-multi-window-in-android-n-7bed803dda64#.xxos0lhpn


本文地址 http://ihongqiqu.com/2016/04/06/Android-N-Multi-Window/ 作者为 Zhenguo

author:Zhenguo
Author: Zhenguo      Blog: http://ihongqiqu.com/     Email: jinzhenguo1990@gmail.com
I have almost 6 years of Android application development experience and have a keen interested in the latest emerging technologies. I use my spare time to turn my experience, ideas and love for Android tech into informative articles, tutorials and more in hope to help others and learn more.
文章目录
  1. 1. 建议一:使用正确的Context
  2. 2. 建议二:正确处理状态改变
  3. 3. 建议三:处理多方向
  4. 4. 建议四:建立基于支持各种屏幕尺寸的响应式UI
  5. 5. 建议五:被其他应用打开的 Activity 必须支持多窗口
  6. 6. 终极建议:多测试
返回顶部