Android N 多窗口模式,你需要知道的一切
Android N中最大、最引人注意的變化就是Mutil-window模式。對(duì)于一個(gè)開(kāi)發(fā)者,我們最關(guān)心的就是:Mutil-window模式下怎么配置mutil-window模式、Activity的生命周期的變化、提供了什么API。
讓你的應(yīng)用支持 Mutil-window 模式
首先先將設(shè)置編譯時(shí)的sdk和工具版本。具體見(jiàn)下圖.
接下來(lái)就是對(duì) Activity 的配置了,你可以在 AndroidManifest 中設(shè)置activity是否在 mutil-window 模式下顯示,以及顯示的樣式(大小和布局)。同一個(gè)task中的所有activity的樣式取決棧底的activity的樣式。
決定是否在 mutil-window 下顯示的代碼很簡(jiǎn)單、只要在或者節(jié)點(diǎn)下設(shè)置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>
實(shí)際操作過(guò)程中,發(fā)現(xiàn)在 Mutil-window模式下設(shè)置 在 中設(shè)置 元素是無(wú)效的,比如 defaultHeight、defaultWidth.可能 元素只在畫(huà)中畫(huà)(pictures-in-picture)模式中有效。
注意:如果使用低于Android N的sdk編譯的app,并且他沒(méi)有限定orientation,在mutil-window模式下,他會(huì)自動(dòng)拉伸兼容,不需要額外地配置字段。但是會(huì)有可能不兼容的警告。但是如果是一個(gè)限定了orientation為 portrait 或 landscape的app,Android N不會(huì)拉伸它,它會(huì)直接占滿(mǎn)整個(gè)屏幕.
Multi-window生命周期
Multi-window生命周期不會(huì)改變Activity生命周期。在Multi-window的模式下,只有用戶(hù)最近使用的那個(gè)Activity會(huì)處于激活狀態(tài)。這個(gè)Activity會(huì)被認(rèn)為是最頂層的,其他的activity都會(huì)處于pause狀態(tài),即使他們是可見(jiàn)的。然而,Android系統(tǒng)會(huì)給這些pause但是可見(jiàn)的activity更高的優(yōu)先級(jí)。如果用戶(hù)跟某個(gè)pause的Activity交互,那么Activity就會(huì)resumed,前一個(gè)頂層的Activity會(huì)被pause。
注意:在 multi-windo 模式,一個(gè)App可以處于pause狀態(tài)但是依然對(duì)用戶(hù)可見(jiàn)。一個(gè)App可能需要運(yùn)行他的activity即使它處于pause狀態(tài).比如,一個(gè)視屏播放軟件,他已經(jīng)處于暫停狀態(tài),但是依然對(duì)用戶(hù)可見(jiàn)需要繼續(xù)播放他的視頻。因此,我們建議Activity不要在onPause()的時(shí)候暫停視頻播放,而應(yīng)該在onStop()中,在onStart()中恢復(fù)播放。
當(dāng)用戶(hù)將一個(gè)App置于 mutil-window 模式,系統(tǒng)將會(huì)通知 Activity 配置變更,作為運(yùn)行時(shí)的變更。特別是這個(gè)改變就像系統(tǒng)切換豎屏和橫屏一樣。對(duì)于處理運(yùn)行時(shí)的配置變化,你的 Activity 可以在對(duì)應(yīng)的配置變更回調(diào)(比如 onMultiWindowChanged() 中處理,或者讓系統(tǒng)自動(dòng)處理它的銷(xiāo)毀和重新創(chuàng)建。
接下來(lái)我們?cè)诰唧w的 Activity 生命周期回調(diào)函數(shù)中輸出log,看看 mutil-window 模式下生命周期
從全屏到 mutil-window 模式
mutil-window 模式到全屏模式
這里可以看見(jiàn)當(dāng)從mutil-window模式到全屏模式的時(shí)候,onMultiWindowChanged()函數(shù)就被調(diào)用了。我們可以在這里處理跟顯示模式切換有關(guān)的東西。
新的API
這些新的API可以讓接收到 Mutil-window 狀態(tài)改變的通知,以及判斷是否處于 Mutil-window 模式。
Activity.inMultiWindow()
是否處于 multi-window 模式。
Activity.inPictureInPicture()
是否處于畫(huà)中畫(huà)模式.
注意: 畫(huà)中畫(huà)模式是 Mutil-window 模式的特例. 如果 myActivity.inPictureInPicture() 返回 true, 那么myActivity.inMultiWindow() 也會(huì)返回 true.
Activity.onMultiWindowChanged(boolean inMultiWindow)
系統(tǒng)會(huì)在activity進(jìn)入或者退出 mutil-window 模式回調(diào)這個(gè)方法。它會(huì)傳遞一個(gè)值指示activity是否進(jìn)入 mutil-window 模式,true 代表正在進(jìn)入 mutil-window 模式,false 代表正在退出。
Activity.onPictureInPictureChanged(boolean inPictureInPicture)
系統(tǒng)會(huì)在activity進(jìn)入或者退出 畫(huà)中畫(huà) 模式回調(diào)這個(gè)方法。它會(huì)傳遞一個(gè)值指示activity是否進(jìn)入畫(huà)中畫(huà)模式,true 代表正在進(jìn)入畫(huà)中畫(huà)模式,false 代表正在退出。
Fragment也有對(duì)應(yīng)的方法,比如說(shuō)Fragment.inMultiWindow()
感想
我覺(jué)得這是Android N絕對(duì)殺手級(jí)的feature,想想能邊看電影邊微信就覺(jué)得很滿(mǎn)足。
Android 平板之前一直被詬病沒(méi)有多少適合的App,這下可好了,直接分屏使用,爽爆炸。特別Google對(duì)Pixel C還有25%的優(yōu)惠。
總結(jié)
以上是生活随笔為你收集整理的Android N 多窗口模式,你需要知道的一切的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mongoengine.NotUniqu
- 下一篇: 《战神3》图文流程攻略操作介绍