Android N 多窗口模式,你需要知道的一切

Android N中最大、最引人注意的变化就是Mutil-window模式。对于一个开发者,我们最关心的就是:Mutil-window模式下怎么配置mutil-window模式、Activity的生命周期的变化、提供了什么API。
让你的应用支持 Mutil-window 模式
首先先将设置编译时的sdk和工具版本。具体见下图.

接下来就是对 Activity 的配置了,你可以在 AndroidManifest 中设置activity是否在 mutil-window 模式下显示,以及显示的样式(大小和布局)。同一个task中的所有activity的样式取决栈底的activity的样式。
决定是否在 mutil-window 下显示的代码很简单、只要在或者节点下设置android:resizeableActivity属性就行了。
<application
android:resizeableActivity="true">
<activity android:name=".MainActivity">
<layout
android:defaultHeight="500dp"
android:defaultWidth="300dp"
android:gravity="top|end"
android:minimalSize="200dp" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
实际操作过程中,发现在 Mutil-window模式下设置 在 中设置 元素是无效的,比如 defaultHeight、defaultWidth.可能 元素只在画中画(pictures-in-picture)模式中有效。
注意:如果使用低于Android N的sdk编译的app,并且他没有限定orientation,在mutil-window模式下,他会自动拉伸兼容,不需要额外地配置字段。但是会有可能不兼容的警告。但是如果是一个限定了orientation为 portrait 或 landscape的app,Android N不会拉伸它,它会直接占满整个屏幕.
Multi-window生命周期
Multi-window生命周期不会改变Activity生命周期。在Multi-window的模式下,只有用户最近使用的那个Activity会处于激活状态。这个Activity会被认为是最顶层的,其他的activity都会处于pause状态,即使他们是可见的。然而,Android系统会给这些pause但是可见的activity更高的优先级。如果用户跟某个pause的Activity交互,那么Activity就会resumed,前一个顶层的Activity会被pause。
注意:在 multi-windo 模式,一个App可以处于pause状态但是依然对用户可见。一个App可能需要运行他的activity即使它处于pause状态.比如,一个视屏播放软件,他已经处于暂停状态,但是依然对用户可见需要继续播放他的视频。因此,我们建议Activity不要在onPause()的时候暂停视频播放,而应该在onStop()中,在onStart()中恢复播放。
当用户将一个App置于 mutil-window 模式,系统将会通知 Activity 配置变更,作为运行时的变更。特别是这个改变就像系统切换竖屏和横屏一样。对于处理运行时的配置变化,你的 Activity 可以在对应的配置变更回调(比如 onMultiWindowChanged() 中处理,或者让系统自动处理它的销毁和重新创建。
接下来我们在具体的 Activity 生命周期回调函数中输出log,看看 mutil-window 模式下生命周期
从全屏到 mutil-window 模式


mutil-window 模式到全屏模式
这里可以看见当从mutil-window模式到全屏模式的时候,onMultiWindowChanged()函数就被调用了。我们可以在这里处理跟显示模式切换有关的东西。

新的API
这些新的API可以让接收到 Mutil-window 状态改变的通知,以及判断是否处于 Mutil-window 模式。
Activity.inMultiWindow()
是否处于 multi-window 模式。Activity.inPictureInPicture()
是否处于画中画模式.
注意: 画中画模式是 Mutil-window 模式的特例. 如果 myActivity.inPictureInPicture() 返回 true, 那么myActivity.inMultiWindow() 也会返回 true.
- Activity.onMultiWindowChanged(boolean inMultiWindow)
系统会在activity进入或者退出 mutil-window 模式回调这个方法。它会传递一个值指示activity是否进入 mutil-window 模式,true 代表正在进入 mutil-window 模式,false 代表正在退出。 - Activity.onPictureInPictureChanged(boolean inPictureInPicture)
系统会在activity进入或者退出 画中画 模式回调这个方法。它会传递一个值指示activity是否进入画中画模式,true 代表正在进入画中画模式,false 代表正在退出。
Fragment也有对应的方法,比如说Fragment.inMultiWindow()
感想
- 我觉得这是Android N绝对杀手级的feature,想想能边看电影边微信就觉得很满足。
- Android 平板之前一直被诟病没有多少适合的App,这下可好了,直接分屏使用,爽爆炸。特别Google对Pixel C还有25%的优惠。
Android N 多窗口模式,你需要知道的一切的更多相关文章
- Android N多窗口支持
Android N 可以同时显示多个应用窗口. 在手机上,两个应用可以在"分屏"模式中左右并排或上下并排显示.例如,用户可以 在上面窗口聊QQ,下面窗口发送短信. 如图所示,两个a ...
- Android开发学习之路-Android N新特性-多窗口模式
我们都知道,在最新的Android N系统中,加入了一个新的功能,就是多窗口模式.多窗口模式允许我们在屏幕上显示两个窗口,每个窗口显示的内容不同,也就是说,我们可以一遍看电视剧,一边聊微信. 这里我们 ...
- Android应用程序窗口(Activity)与WindowManagerService服务的连接过程分析
在前两文中,我们分析了Activity组件的窗口对象和视图对象的创建过程.Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求 ...
- <Android>从窗口泄漏谈android:configChanges属性
今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志.大致的意思就是android.view.windowleaked--窗口泄漏.我在网上查了资 ...
- Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了And ...
- Android 设计模式之MVC模式
说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...
- Android Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏)
Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏) [科普]什么叫真正的“沉浸式”状态栏? 为什么在国内会有很多用户把「透明栏」(Translucent ...
- Android应用程序窗口(Activity)的视图对象(View)的创建过程分析
从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口.每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图.应用程序窗口视图是真正用来 ...
- 【转】Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行
当打开这个设置以后,程序的Activity会自动销毁,每次返回的时候就会不断重oncreate,此时伴随的问题多多. 参考文档:http://www.bubuko.com/infodetail-960 ...
随机推荐
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- UWP 判断windows mobile是使用的实体键还是虚拟按键
最近在写启动屏幕,发现虚拟按钮会挡住,启动屏幕的最下面的元素,大概有50 px.可是有什么办法知道手机是用的实体键还是虚拟按键吗? 如下图.可以看到红色的部分显示了一点点.代码里设置的是60px. 在 ...
- sql union和union all的用法及效率
UNION指令的目的是将两个SQL语句的结果合并起来.从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION的一个限制是两个 ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- PHP通过加锁实现并发情况下抢码实现
需求:抢码功能 要求: 1.特定时间段才开放抢码: 2.每个时间段放开的码是有限的: 3.每个码不允许重复: 实现: 1.在不考虑并发的情况下实现: function get_code($len){ ...
- 20161023 NOIP 模拟赛 T2 解题报告
Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- UBUNTU 16.04 编译 OPENJDK8
参考了几篇文章,和错误查询,最后总结如下 一.下载 我比较倾向于使用mercurial来获取源代码,虽然你得挑网络稳定的时候更新,但是易更新. 从官网查找一下,可以通过以下步骤完成源代码的下载 1. ...
- JavaScript解惑记之Array.prototype.sort()
前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...
- 【WPF】WPF中的List<T>和ObservableCollection<T>
在WPF中 控件绑定数据源时,数据源建议采用 ObservableCollection<T>集合 ObservableCollection<T> 类:表示一个动态数据集合,在添 ...
