惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
B
Blog
P
Proofpoint News Feed
美团技术团队
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
有赞技术团队
有赞技术团队
小众软件
小众软件
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
罗磊的独立博客
L
LangChain Blog
GbyAI
GbyAI
腾讯CDC
T
The Blog of Author Tim Ferriss
Microsoft Security Blog
Microsoft Security Blog

博客园 - 陈哈哈

Claude Code Windows 通知配置指南 Windows 上 agent-browser 使用问题排查与解决 踩坑实录:win11中Claude Code MCP 配置 context7 失败与调用问题全排查 Mac下设置Android源代码编译环境 Android编译过程中的碎碎念 编译Android AOSP代码 国内不FQ下载Android 源代码 android-plugmgr源代码分析 收集最好的Mac软件和使用方法 为什么使用Binder而不是其他IPC机制 Android什么时候进行View中Background的加载 Android属性动画源代码解析(超详细) Fragment提交transaction导致state loss异常 Android怎么找到最优适配资源 解决在onCreate()过程中获取View的width和Height为0的4种方法 【译】使用newInstance()来实例化fragment 【译】Activitys, Threads和 内存泄露 【译】什么导致了Context泄露:Handler&内部类 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
Android N 多窗口模式,你需要知道的一切
陈哈哈 · 2016-03-13 · via 博客园 - 陈哈哈

Paste_Image.png
Android N中最大、最引人注意的变化就是Mutil-window模式。对于一个开发者,我们最关心的就是:Mutil-window模式下怎么配置mutil-window模式、Activity的生命周期的变化、提供了什么API。

让你的应用支持 Mutil-window 模式

  1. 首先先将设置编译时的sdk和工具版本。具体见下图.
    Paste_Image.png

  2. 接下来就是对 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 模式

全屏到小窗口.gif

Paste_Image.png

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

Paste_Image.png

新的API

这些新的API可以让接收到 Mutil-window 状态改变的通知,以及判断是否处于 Mutil-window 模式。

  1. Activity.inMultiWindow()
    是否处于 multi-window 模式。

  2. Activity.inPictureInPicture()
    是否处于画中画模式.

注意: 画中画模式是 Mutil-window 模式的特例. 如果 myActivity.inPictureInPicture() 返回 true, 那么myActivity.inMultiWindow() 也会返回 true.

  1. Activity.onMultiWindowChanged(boolean inMultiWindow)
    系统会在activity进入或者退出 mutil-window 模式回调这个方法。它会传递一个值指示activity是否进入 mutil-window 模式,true 代表正在进入 mutil-window 模式,false 代表正在退出。
  2. Activity.onPictureInPictureChanged(boolean inPictureInPicture)
    系统会在activity进入或者退出 画中画 模式回调这个方法。它会传递一个值指示activity是否进入画中画模式,true 代表正在进入画中画模式,false 代表正在退出。

Fragment也有对应的方法,比如说Fragment.inMultiWindow()

感想

  1. 我觉得这是Android N绝对杀手级的feature,想想能边看电影边微信就觉得很满足。
  2. Android 平板之前一直被诟病没有多少适合的App,这下可好了,直接分屏使用,爽爆炸。特别Google对Pixel C还有25%的优惠