Android 7.0正式版在近期開(kāi)始進(jìn)行了推送,該版本中最大的一個(gè)特色就是支持在設(shè)備上展示多窗口供用戶查看各個(gè)應(yīng)用。
如何切換到多窗口模式
? 多窗口模式有兩種:分屏模式和自由形狀模式。
分屏模式

? 進(jìn)入分屏模式的操作:在overview屏幕下,長(zhǎng)按Activity標(biāo)題,然后可以拖動(dòng)該 Activity 至屏幕突出顯示的區(qū)域。

? 在分屏模式下,手指可以拖動(dòng)分界線,放大其中一個(gè)應(yīng)用,同時(shí)縮小另一個(gè)。如果這個(gè)應(yīng)用在新展開(kāi)的區(qū)域繪制滯后,系統(tǒng)將使用 windowBackground 屬性或默認(rèn) windowBackgroundFallback 樣式屬性指定的顏色暫時(shí)填充該區(qū)域。
自由形狀模式

? 進(jìn)入自由形狀模式的操作:稍微麻煩點(diǎn),前提是要有運(yùn)行 Android N 的模擬器或者已root的設(shè)備。目前為止(2016年9月初),在使用自由形狀模式時(shí)可能Crash,所以google把該模式藏的比較深。開(kāi)啟和進(jìn)入該模式的步驟如下:
- 打開(kāi)模擬器或者用usb線連接已root了的設(shè)備
- 在cmd命令行中輸入adb shell
- 然后輸入su獲得root操作權(quán)限
- 輸入
settings put global enable_freeform_support 1 - 重啟模擬器或設(shè)備。
- 進(jìn)入自由形狀模式:在overview屏幕下,長(zhǎng)按Activity標(biāo)題,將會(huì)在右邊出現(xiàn)一個(gè)方塊狀的圖標(biāo),點(diǎn)擊該圖標(biāo),該Activity該會(huì)以自由形狀模式展示,通過(guò)對(duì)該Activity頁(yè)面的左上角并拖拽,可以修改其形狀大小。

多窗口生命周期
- 多窗口模式不會(huì)更改生命周期,多窗口模式下,最近的與用戶進(jìn)行交互的那個(gè)Activity為活動(dòng)狀態(tài)(Resume),所有其他的Activity雖然可見(jiàn),但是都會(huì)處于暫停狀態(tài)(pause)。但是這些已暫停但可見(jiàn)的 Activity 在系統(tǒng)中享有比不可見(jiàn) Activity 更高的優(yōu)先級(jí)。 如果用戶與其中一個(gè)暫停的 Activity 交互,該 Activity 將恢復(fù),而之前的頂級(jí) Activity 將被暫停。
- 根據(jù)google官方文檔上的描述,你如果在應(yīng)用中做了視頻播放效果,那么不要再在onPause中去暫停播放視頻了,因?yàn)槎啻翱谀J较拢愕腁ctivity雖然被暫停,但還是處于可見(jiàn)狀態(tài)。建議在onStop方法中去暫停播放視頻。
- 切換到多窗口時(shí),Activity會(huì)發(fā)生配置變更,該變更與系統(tǒng)進(jìn)行橫豎屏切換時(shí)的 Activity 生命周期影響基本相同。你可以對(duì) Activity 自行處理配置變更,或著默許系統(tǒng)去銷毀 Activity,并以新的尺寸重新創(chuàng)建該 Activity。
如何禁用多窗口模式
- 如果應(yīng)用需要適配Android N,那么,一定要注意你開(kāi)發(fā)的應(yīng)用在多窗口模式下的使用效果。
- Android 的SDK版本中給AndroidManifest里的Application(Activity)新增了一個(gè)屬性:
android:resizeableActivity=["true" | "false"]
? 該屬性為true時(shí),將支持多窗口,為false時(shí)不支持,展示時(shí)只能是全屏模式(PS:該屬性不配置時(shí),默認(rèn)為true)。Activity任務(wù)棧里第一個(gè)入棧的Activity的該屬性,會(huì)被棧內(nèi)的其他Activity繼承。
? 比如說(shuō),任務(wù)棧中第一個(gè)入棧Activity里的resizeableActivity為true,那么即使接下來(lái)入棧的Activity的該屬性為false,在多窗口模式下進(jìn)行展示時(shí),新入棧的Acitivity也不會(huì)強(qiáng)制進(jìn)入全屏模式。
- 當(dāng)你開(kāi)發(fā)編譯使用的SDK版本低于Android N時(shí),那么多窗口模式下,你的應(yīng)用會(huì)被系統(tǒng)強(qiáng)制性的修改頁(yè)面大小,并且系統(tǒng)會(huì)彈出相應(yīng)的Toast進(jìn)行警告。
- 當(dāng)你開(kāi)發(fā)編譯使用的SDK版本低于Android N時(shí),如果你不希望系統(tǒng)去強(qiáng)制修改你的頁(yè)面,比較偷懶的解決方案是:在AndroidMainifest中配置Applcaiton(或Activity任務(wù)棧里的首個(gè)入棧Activity)的android:screenOrientation屬性。配了該屬性后,你的頁(yè)面將不支持多窗口,但是缺點(diǎn)就是Activity的朝向會(huì)被固定。(PS:這就是國(guó)內(nèi)大部分應(yīng)用目前不能展示在多窗口模式中的原因)
多窗口模式中一些被禁用的功能
? 在設(shè)備處于多窗口模式中時(shí),某些功能會(huì)被禁用或忽略,因?yàn)檫@些功能對(duì)與其他 Activity 或應(yīng)用共享設(shè)備屏幕的 Activity 而言沒(méi)有意義。 此類功能包括:
- 某些系統(tǒng) UI 自定義選項(xiàng)將被禁用;例如,在非全屏模式中,應(yīng)用將無(wú)法去隱藏狀態(tài)欄。
- 系統(tǒng)將忽略對(duì)
android:screenOrientation屬性所作的更改。
如果應(yīng)用禁止多窗口支持
? 如果您通過(guò)設(shè)置 android:resizableActivity="false" 禁用了多窗口支持,則應(yīng)在運(yùn)行 Android N 的設(shè)備上啟動(dòng)應(yīng)用,并嘗試將應(yīng)用切換到自由形狀和分屏模式。 驗(yàn)證并確保執(zhí)行此操作后,應(yīng)用仍保持全屏模式。
如果應(yīng)用需要多窗口支持
在多窗口模式中啟動(dòng)新 Activity
? 處于分屏模式中,在啟動(dòng)新 Activity 時(shí),如果你想將新 Activity 顯示在當(dāng)前 Activity 的旁邊那一屏??墒褂脴?biāo)志Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。此標(biāo)志將請(qǐng)求以下行為:
如果設(shè)備處于分屏模式,系統(tǒng)會(huì)嘗試在啟動(dòng)系統(tǒng)的 Activity 旁創(chuàng)建新 Activity,這樣兩個(gè) Activity 將共享屏幕。 系統(tǒng)并不一定能實(shí)現(xiàn)此操作,但如果可以,系統(tǒng)將使兩個(gè) Activity 處于相鄰的位置。
-
如果設(shè)備不處于分屏模式,則該標(biāo)志無(wú)效。
?處于自由形狀模式中,則在啟動(dòng)新 Activity 時(shí),用戶可使用
ActivityOptions.setLaunchBounds()指定新 Activity 的尺寸和屏幕位置。 如果設(shè)備不處于多窗口模式,則該方法無(wú)效。
如果要在任務(wù)棧中啟動(dòng) Activity,該 Activity 將替換屏幕上的 Activity,并繼承其所有的多窗口屬性。 如果想避免替換,讓新Activity在多窗口模式中以另一個(gè)單獨(dú)的窗口來(lái)展示,則必須讓這個(gè)Activity在新的任務(wù)棧中來(lái)啟動(dòng)。
為多窗口模式準(zhǔn)備的布局屬性
? 對(duì)于 Android N,可以在清單文件的<Activity>元素中支持以下幾種屬性,這些屬性影響 Activity 會(huì)多窗口模式中的行為:
android:defaultWidth <!--以自由形狀模式啟動(dòng)時(shí) Activity 的默認(rèn)寬度。-->
android:defaultHeight <!--以自由形狀模式啟動(dòng)時(shí) Activity 的默認(rèn)高度。-->
android:gravity <!--以自由形狀模式啟動(dòng)時(shí) Activity 的初始位置。-->
android:minHeight、android:minWidth
<!-- 分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動(dòng)分界線,使 Activity 尺寸低于指定的最小值,系統(tǒng)會(huì)將 Activity 裁剪為用戶請(qǐng)求的尺寸 -->
? 例如,以下節(jié)點(diǎn)顯示了如何指定 Activity 在自由形狀模式中顯示時(shí) Activity 的默認(rèn)大小、位置和最小尺寸:
<activity android:name=".MyActivity">
<layout android:defaultHeight="400dp"
android:defaultWidth="400dp"
android:gravity="top|end"
android:minHeight="250dp"
android:minWidth="250dp" />
</activity>
多窗口變更通知和查詢
? Activity 類中添加了一些新方法,以支持多窗口顯示:
/*調(diào)用該方法以確認(rèn) Activity 是否處于多窗口模式。*/
Activity.isInMultiWindowMode()
/*Activity 進(jìn)入或退出多窗口模式時(shí)系統(tǒng)將調(diào)用此方法。 在 Activity 進(jìn)入多窗口模式時(shí),系統(tǒng)向該方法傳遞 true 值,在退出多窗口模式時(shí),則傳遞 false 值。*/
Activity.onMultiWindowModeChanged()
? 每個(gè)方法還有 Fragment 版本,例如 Fragment.isInMultiWindowMode()
支持拖放
? 以前的版本中,只能在一個(gè)Activity中進(jìn)行數(shù)據(jù)的拖放。在Android N中,多窗口模式下,可以在兩個(gè)Activity之間互相拖放數(shù)據(jù),因?yàn)槠?lan)幅(ai)有(fa)限(zuo),此處不再展開(kāi)。
參考資料:
[google官方文檔][https://developer.android.com/guide/topics/ui/multi-window.html]