Android N中最大、最引人注意的變化就是Mutil-window模式曼追。對于一個開發(fā)者窍仰,我們最關(guān)心的就是:Mutil-window模式下怎么配置mutil-window模式、Activity的生命周期的變化礼殊、提供了什么API驹吮。
讓你的應(yīng)用支持 Mutil-window 模式
-
首先先將設(shè)置編譯時的sdk和工具版本。具體見下圖.
Paste_Image.png
- 接下來就是對 Activity 的配置了晶伦,你可以在 AndroidManifest 中設(shè)置activity是否在 mutil-window 模式下顯示碟狞,以及顯示的樣式(大小和布局)。同一個task中的所有activity的樣式取決棧底的activity的樣式婚陪。
決定是否在 mutil-window 下顯示的代碼很簡單族沃、只要在<application>或者<activity>節(jié)點下設(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>
實際操作過程中,發(fā)現(xiàn)在 Mutil-window模式下設(shè)置 在 <activity> 中設(shè)置 <layout>元素是無效的,比如 defaultHeight竭业、defaultWidth.可能 <layout> 元素只在畫中畫(pictures-in-picture)模式中有效智润。
注意:如果使用低于Android N的sdk編譯的app,并且他沒有限定orientation未辆,在mutil-window模式下,他會自動拉伸兼容锯玛,不需要額外地配置字段咐柜。但是會有可能不兼容的警告。但是如果是一個限定了orientation為 portrait 或 landscape的app攘残,Android N不會拉伸它拙友,它會直接占滿整個屏幕.
Multi-window生命周期
Multi-window生命周期不會改變Activity生命周期。在Multi-window的模式下歼郭,只有用戶最近使用的那個Activity會處于激活狀態(tài)遗契。這個Activity會被認為是最頂層的,其他的activity都會處于pause狀態(tài),即使他們是可見的病曾。然而牍蜂,Android系統(tǒng)會給這些pause但是可見的activity更高的優(yōu)先級。如果用戶跟某個pause的Activity交互泰涂,那么Activity就會resumed鲫竞,前一個頂層的Activity會被pause。
注意:在 multi-windo 模式逼蒙,一個App可以處于pause狀態(tài)但是依然對用戶可見从绘。一個App可能需要運行他的activity即使它處于pause狀態(tài).比如,一個視屏播放軟件是牢,他已經(jīng)處于暫停狀態(tài)僵井,但是依然對用戶可見需要繼續(xù)播放他的視頻。因此驳棱,我們建議Activity不要在onPause()的時候暫停視頻播放批什,而應(yīng)該在onStop()中,在onStart()中恢復(fù)播放蹈胡。
當(dāng)用戶將一個App置于 mutil-window 模式渊季,系統(tǒng)將會通知 Activity 配置變更,作為運行時的變更罚渐。特別是這個改變就像系統(tǒng)切換豎屏和橫屏一樣却汉。對于處理運行時的配置變化,你的 Activity 可以在對應(yīng)的配置變更回調(diào)(比如 onMultiWindowChanged() 中處理荷并,或者讓系統(tǒng)自動處理它的銷毀和重新創(chuàng)建合砂。
接下來我們在具體的 Activity 生命周期回調(diào)函數(shù)中輸出log,看看 mutil-window 模式下生命周期
從全屏到 mutil-window 模式
** mutil-window 模式到全屏模式**
這里可以看見當(dāng)從mutil-window模式到全屏模式的時候源织,onMultiWindowChanged()函數(shù)就被調(diào)用了翩伪。我們可以在這里處理跟顯示模式切換有關(guān)的東西微猖。
新的API
這些新的API可以讓接收到 Mutil-window 狀態(tài)改變的通知,以及判斷是否處于 Mutil-window 模式缘屹。
Activity.inMultiWindow()
是否處于 multi-window 模式凛剥。Activity.inPictureInPicture()
是否處于畫中畫模式.
注意: 畫中畫模式是 Mutil-window 模式的特例. 如果 myActivity.inPictureInPicture() 返回 true, 那么myActivity.inMultiWindow() 也會返回 true.
-
Activity.onMultiWindowChanged(boolean inMultiWindow)
系統(tǒng)會在activity進入或者退出 mutil-window 模式回調(diào)這個方法。它會傳遞一個值指示activity是否進入 mutil-window 模式轻姿,true 代表正在進入 mutil-window 模式犁珠,false 代表正在退出。 -
Activity.onPictureInPictureChanged(boolean inPictureInPicture)
系統(tǒng)會在activity進入或者退出 畫中畫 模式回調(diào)這個方法互亮。它會傳遞一個值指示activity是否進入畫中畫模式犁享,true 代表正在進入畫中畫模式,false 代表正在退出豹休。
Fragment也有對應(yīng)的方法炊昆,比如說Fragment.inMultiWindow()
感想
- 我覺得這是Android N絕對殺手級的feature,想想能邊看電影邊微信就覺得很滿足威根。
- Android 平板之前一直被詬病沒有多少適合的App凤巨,這下可好了,直接分屏使用医窿,爽爆炸磅甩。特別Google對Pixel C還有25%的優(yōu)惠。