本文章抄送Androiddeveloper網(wǎng)站煮纵,目的是為方便學(xué)習(xí)記錄。
切換到多窗口模式方式
- 若用戶打開OverView屏幕并長按Activity標(biāo)題消玄,則可以拖動(dòng)該Activity至屏幕突出顯示的區(qū)域荔燎,使Activity進(jìn)入多窗口模式。
- 若用戶長按Overview按鈕方庭,設(shè)備上的當(dāng)前Activity將進(jìn)入多窗口模式厕吉,同時(shí)將打開Overview屏幕,用戶可在該屏幕中選擇要共享屏幕的另一個(gè)Activity械念。
多窗口生命周期
多窗口模式不會(huì)更改Activity生命周期头朱。
在多窗口模式中,在指定時(shí)間只有最近與用戶交互過的Activity為活動(dòng)狀態(tài)龄减。該Activity將被視為頂級Activity项钮。所有其他Activity雖然可見。但均處于暫停狀態(tài)希停。但是烁巫,這些已經(jīng)暫停但可見的Activity在系統(tǒng)中享有比不可見Activity更高優(yōu)先級。如果用戶與其中一個(gè)暫停的Activity交互宠能,改Activity將恢復(fù)亚隙,而之前的頂級Activity將暫停。
> 注:在多窗口模式中违崇,用戶仍可以看到處于暫停狀態(tài)的應(yīng)用阿弃,诊霹。應(yīng)用在暫停狀態(tài)下可能仍需要繼續(xù)其操作。例如:處于暫停模式但可見的視屏播放應(yīng)用繼續(xù)顯示視頻渣淳。因此脾还,我們建議播放視頻的Activity不要暫停其onPauser()處理程序中的視頻。應(yīng)暫停onStop()中的視頻入愧,并恢復(fù)onStart()中的視頻播放鄙漏。
如處理運(yùn)行時(shí)變更中所述,用戶使用多窗口模式顯示應(yīng)用時(shí)砂客,系統(tǒng)將通知Activity發(fā)生配置變更泥张。這也會(huì)發(fā)生在當(dāng)用戶調(diào)整應(yīng)用大小,或?qū)?yīng)用恢復(fù)到全屏幕模式。該變更與系統(tǒng)通知應(yīng)用設(shè)備從縱向模式切換到橫向模式時(shí) 的Activity生命周期影響基本相同,但設(shè)備不僅僅是交換尺寸明棍,而是會(huì)變更尺寸画切。如處理運(yùn)行時(shí)變更中所述,您的Activity可以自行處理配置變更,或許系統(tǒng)銷毀Activity,并以新的尺寸重新創(chuàng)建改Activity。
如果用戶調(diào)整窗口大小芒炼,并在任意緯度放大窗口尺寸,系統(tǒng)將調(diào)整Activity以匹配用戶操作术徊,同時(shí)根據(jù)需要發(fā)布運(yùn)行時(shí)變更本刽。如果應(yīng)用在心公開區(qū)域的回執(zhí)滯后,系統(tǒng)將使用windowBackground屬性或默認(rèn)windowBackground樣式屬性指定的顏色暫時(shí)填充該區(qū)域赠涮。
針對多窗口模式配置應(yīng)用
如果您的應(yīng)用面向Android N,您可以對應(yīng)用的Activity是否支持多窗口顯示以及顯示的方式進(jìn)行配置子寓。您可以在清單文件中設(shè)置屬性,以控制大小和布局笋除。根據(jù)Activity的屬性設(shè)置適用于其他任務(wù)棧中所有Activity斜友。例如,如果根據(jù)Activity已a(bǔ)ndroid.resizeableActivity設(shè)定為true垃它,則任務(wù)棧中所有的Activity都將調(diào)整大小鲜屏。
> 注:如果您使用低于Android N版本的SDK構(gòu)建應(yīng)用,則用戶再多窗口模式中適用應(yīng)用時(shí)国拇,系統(tǒng)將強(qiáng)制調(diào)整應(yīng)用的大小洛史。系統(tǒng)將顯示對話框,提示用戶應(yīng)用可能會(huì)發(fā)生異常贝奇。系統(tǒng)將不會(huì)調(diào)整定向應(yīng)用的大泻绶啤;如果用戶嘗試再多窗口模式下打開定向應(yīng)用掉瞳,應(yīng)用將全屏顯示毕源。
android.resizeableActivity
在清單的<activity>或<application>節(jié)點(diǎn)中設(shè)置該屬性,啟用或禁用多窗口顯示:
? ? android:resizeableActivity=["true" | "false"]
?布局屬性?
對于Android N陕习,<layout>清單元素支持一下幾種屬性霎褐,這些屬性影響Activity在多窗口模式中的行為:
android:defaultWidth //以自由形狀模式啟動(dòng)時(shí)Activity的默認(rèn)高度
android:defaultHeight // 以自由形式模式啟動(dòng)時(shí)Activity的默認(rèn)高度
android:gravity // 以自由形狀模式啟動(dòng)時(shí)Activity的初始位置。
android:minimalHeight该镣、android:minimalWidth // 分屏和自由形狀模式中Activity的最小高度和最小寬度冻璃。
?再多窗口模式中運(yùn)行應(yīng)用
Android N添加了新功能,以支持可在多窗口模式中運(yùn)行應(yīng)用损合。
多窗口模式中被禁用的功能
在設(shè)備處于多窗口模式中時(shí)省艳,某些功能會(huì)被禁用或者忽略,因?yàn)檫@些功能對于其他Activity或者應(yīng)用共享屏幕的Activity而言沒有意義嫁审。此功能包括:
- 某些系統(tǒng)UI自定義選項(xiàng)將被禁用跋炕;例如,在非全屏模式中律适,應(yīng)用將無法隱藏狀態(tài)欄辐烂。
- 系統(tǒng)將忽略對 android:screenOrientation屬性所作用的更改。
多窗口變更通知和查詢?
Activity類中添加一下新方法捂贿,以支持多窗口顯示纠修。有關(guān)方法詳細(xì)信息,請閱讀NPreview SDK參考
Activity.isInMultiWindowMode() // 調(diào)用該方法以確認(rèn)Activity是否處于多窗口模式厂僧。
Activity.isInPictureInPictureMode() // 調(diào)用該方法以確認(rèn)Activity是否處于畫中畫模式扣草。
> 注:畫中畫模式是多窗口模式的特列。如果myActivity.isInPictureInPictureMode()返回true颜屠,則myActivity.isInMultiWindowMode()也返回true辰妙。
Activity.onMultWondowModeChanged() // Activity進(jìn)入或退出多窗口模式時(shí)系統(tǒng)將調(diào)用此方法。在Activity進(jìn)入多窗口模式時(shí)汽纤,系統(tǒng)向該方法傳遞true值上岗,退出多窗口模式時(shí),則傳遞false值蕴坪。
Activity.onPictureInPictureModeChanged() // Activity進(jìn)入或退出畫中畫模式時(shí)系統(tǒng)將調(diào)用該方法肴掷。在Activity進(jìn)入畫中畫模式時(shí),系統(tǒng)向該方法傳遞true值背传,退出畫中畫模式時(shí)呆瞻,則傳遞false值。
進(jìn)入畫中畫模式?
如需要在畫中畫模式中啟動(dòng)Activity径玖,請調(diào)用新方法Activity.enterPictureInPictureMode()痴脾。如果設(shè)備不支持畫中畫模式,則此方法無效梳星。
在多窗口模式中啟動(dòng)新的Activity?
在啟動(dòng)新Activity時(shí)赞赖,用戶可以提示系統(tǒng)如果可能滚朵,應(yīng)將新的Activity顯示在當(dāng)前Activity旁邊。要執(zhí)行此操作前域,可以使用標(biāo)志`Intent.FLAG_ACTIVITY_TO_ADJACENT`辕近。傳遞此標(biāo)志將請求一下行為:
- 如果設(shè)備處于分屏狀態(tài),系統(tǒng)會(huì)嘗試在啟動(dòng)系統(tǒng)的Activity旁邊創(chuàng)建新的Activity匿垄,這樣兩個(gè)Activity將共享屏幕移宅。系統(tǒng)并不一定實(shí)現(xiàn)此操作。但如果可以椿疗,系統(tǒng)將使兩個(gè)Activity處于相鄰的位置漏峰。
- 如果設(shè)備不處于分屏狀態(tài),側(cè)設(shè)置將無效届榄。
如果設(shè)備處于自由形狀模式浅乔,在啟動(dòng)新Activity時(shí),用戶可以調(diào)用ActivityOptions.setLaunchBounds()指定新Activity的尺寸和位置痒蓬,如果設(shè)備不處于多窗口模式童擎,則該方法無效。
>注:如果您在任務(wù)棧中啟動(dòng)Activity攻晒,改Activity將替換屏幕上的Activity顾复,并繼承其所有的多窗口屬性。如果要在多窗口模式中以單獨(dú)的窗口啟動(dòng)新的Activity鲁捏,則必須在新的任務(wù)棧啟動(dòng)此Activity芯砸。