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

Paste_Image.png
Android N中最大、最引人注意的變化就是Mutil-window模式。對於一個開發者,咱們最關心的就是:Mutil-window模式下怎麼配置mutil-window模式、Activity的生命週期的變化、提供了什麼API。android

讓你的應用支持 Mutil-window 模式

  1. 首先先將設置編譯時的sdk和工具版本。具體見下圖.
    Paste_Image.pngapi

  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)模式中有效。 app

注意:若是使用低於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() 中處理,或者讓系統自動處理它的銷燬和從新建立。google

接下來咱們在具體的 Activity 生命週期回調函數中輸出log,看看 mutil-window 模式下生命週期code

從全屏到 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.

  3. Activity.onMultiWindowChanged(boolean inMultiWindow)
    系統會在activity進入或者退出 mutil-window 模式回調這個方法。它會傳遞一個值指示activity是否進入 mutil-window 模式,true 表明正在進入 mutil-window 模式,false 表明正在退出。
  4. Activity.onPictureInPictureChanged(boolean inPictureInPicture)
    系統會在activity進入或者退出 畫中畫 模式回調這個方法。它會傳遞一個值指示activity是否進入畫中畫模式,true 表明正在進入畫中畫模式,false 表明正在退出。

Fragment也有對應的方法,好比說Fragment.inMultiWindow()

感想

  1. 我以爲這是Android N絕對殺手級的feature,想一想能邊看電影邊微信就以爲很知足。
  2. Android 平板以前一直被詬病沒有多少適合的App,這下可好了,直接分屏使用,爽爆炸。特別Google對Pixel C還有25%的優惠
相關文章
相關標籤/搜索