Android N 新功能
在 Android N 中拐云,我們?yōu)樵撈脚_引入了一個新的而且非常需要的多任務(wù)處理功能 — 多窗口支持留潦。
現(xiàn)在,用戶可以一次在屏幕上打開兩個應(yīng)用觉啊。
在運行 Android N 的手機和平板電腦上能犯,用戶可以并排運行兩個應(yīng)用鲫骗,或者處于分屏模式時一個應(yīng)用位于另一個應(yīng)用之上。 用戶可以通過拖動兩個應(yīng)用之間的分隔線來調(diào)整應(yīng)用悲雳。
在 Android TV 設(shè)備上挎峦,應(yīng)用可以將自身置于畫中畫模式香追,從而讓它們可以在用戶瀏覽或與其他應(yīng)用交互時繼續(xù)顯示內(nèi)容合瓢。
多窗口支持為您提供新的吸引用戶方式,特別是在平板電腦和其他更大屏幕的設(shè)備上透典。 您甚至可以在您的應(yīng)用中啟用拖放晴楔,從而使用戶可以方便地將內(nèi)容拖放到您的應(yīng)用或從其中拖出內(nèi)容—這是一個非常好的增強用戶體驗的方式顿苇。
向您的應(yīng)用添加多窗口支持并配置多窗口顯示的處理方式非常簡單。 例如税弃,您可以指定您的 Activity 允許的最小尺寸纪岁,從而防止用戶將 Activity 調(diào)整到該尺寸以下。 您還可以為應(yīng)用禁用多窗口顯示则果,這可確保系統(tǒng)將僅以全屏模式顯示應(yīng)用幔翰。
多窗口支持開發(fā)者文檔。
Android N 添加了對同時顯示多個應(yīng)用窗口的支持西壮。 在手持設(shè)備上遗增,兩個應(yīng)用可以在“分屏”模式中左右并排或上下并排顯示。 在電視設(shè)備上款青,應(yīng)用可以使用“畫中畫”模式做修,在用戶與另一個應(yīng)用交互的同時繼續(xù)播放視頻。
如果您使用 N Preview SDK 構(gòu)建應(yīng)用抡草,則可以配置應(yīng)用處理多窗口顯示的方法饰及。 例如,您可以指定 Activity 的最小允許尺寸康震。 您還可以禁用應(yīng)用的多窗口顯示燎含,確保系統(tǒng)僅以全屏模式顯示應(yīng)用
概覽
Android N 允許多個應(yīng)用同時共享屏幕。例如腿短,用戶可以分屏顯示應(yīng)用瘫镇,在左邊查看網(wǎng)頁,同時在右邊寫郵件答姥。 用戶體驗取決于設(shè)備:
運行 Android N 的手持設(shè)備具有分屏模式铣除。 在此模式中,系統(tǒng)以左右并排或上下并排的方式分屏顯示兩個應(yīng)用鹦付。 用戶可以拖動兩個應(yīng)用之間的分界線尚粘,放大其中一個應(yīng)用,同時縮小另一個敲长。
在運行 Android N 的 Nexus Player 上郎嫁,應(yīng)用能以畫中畫模式顯示,即在用戶瀏覽網(wǎng)頁或與其他應(yīng)用交互的同時繼續(xù)顯示內(nèi)容祈噪。
較大設(shè)備的制造商可選擇啟用自由形狀模式泽铛,在該模式中,用戶可以自由調(diào)整各 Activity 的尺寸辑鲤。 若制造商啟用此功能盔腔,設(shè)備將同時具有自由形狀模式和分屏模式。
用戶可以通過以下方式切換到多窗口模式:
若用戶打開 Overview 屏幕并長按 Activity 標(biāo)題弛随,則可以拖動該 Activity 至屏幕突出顯示的區(qū)域瓢喉,使 Activity 進入多窗口模式。
若用戶長按 Overview 按鈕舀透,設(shè)備上的當(dāng)前 Activity 將進入多窗口模式栓票,同時將打開 Overview 屏幕,用戶可在該屏幕中選擇要共享屏幕的另一個 Activity愕够。
用戶可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間拖放數(shù)據(jù) (在此之前走贪,用戶只能在一個 Activity 內(nèi)部拖放數(shù)據(jù))。
多窗口生命周期
多窗口模式不會更改 Activity 生命周期惑芭。
在多窗口模式中厉斟,在指定時間只有最近與用戶交互過的 Activity 為活動狀態(tài)。 該 Activity 將被視為頂級 Activity强衡。** 所有其他 Activity 雖然可見擦秽,但均處于暫停狀態(tài)。 但是漩勤,這些已暫停但可見的 Activity 在系統(tǒng)中享有比不可見 Activity 更高的優(yōu)先級感挥。 如果用戶與其中一個暫停的 Activity 交互,該 Activity 將恢復(fù)越败,而之前的頂級 Activity 將暫停触幼。
注:在多窗口模式中,用戶仍可以看到處于暫停狀態(tài)的應(yīng)用究飞。 應(yīng)用在暫停狀態(tài)下可能仍需要繼續(xù)其操作置谦。 例如,處于暫停模式但可見的視頻播放應(yīng)用應(yīng)繼續(xù)顯示視頻亿傅。因此媒峡,我們建議播放視頻的 Activity 不要暫停其 onPause() 處理程序中的視頻。 應(yīng)暫停 onStop() 中的視頻葵擎,并恢復(fù) onStart() 中的視頻播放谅阿。**
如處理運行時變更中所述,用戶使用多窗口模式顯示應(yīng)用時酬滤,系統(tǒng)將通知 Activity 發(fā)生配置變更签餐。 這也會發(fā)生在當(dāng)用戶調(diào)整應(yīng)用大小,或?qū)?yīng)用恢復(fù)到全屏模式時盯串。 該變更與系統(tǒng)通知應(yīng)用設(shè)備從縱向模式切換到橫向模式時的 Activity 生命周期影響基本相同氯檐,但設(shè)備不僅僅是交換尺寸,而是會變更尺寸体捏。 如處理運行時變更中所述冠摄,您的 Activity 可以自行處理配置變更糯崎,或允許系統(tǒng)銷毀 Activity,并以新的尺寸重新創(chuàng)建該 Activity耗拓。
如果用戶調(diào)整窗口大小,并在任意維度放大窗口尺寸奏司,系統(tǒng)將調(diào)整 Activity 以匹配用戶操作乔询,同時根據(jù)需要發(fā)布運行時變更。 如果應(yīng)用在新公開區(qū)域的繪制滯后韵洋,系統(tǒng)將使用 windowBackground
屬性或默認 windowBackgroundFallback
樣式屬性指定的顏色暫時填充該區(qū)域竿刁。
針對多窗口模式配置應(yīng)用
如果您的應(yīng)用面向 Android N,您可以對應(yīng)用的 Activity 是否支持多窗口顯示以及顯示方式進行配置搪缨。 您可以在清單文件中設(shè)置屬性食拜,以控制大小和布局。 根 Activity 的屬性設(shè)置適用于其任務(wù)棧中的所有 Activity副编。 例如负甸,如果根 Activity 已** android:resizeableActivity**設(shè)定為 true,則任務(wù)棧中的所有 Activity 都將可以調(diào)整大小痹届。
注:如果您使用低于 Android N 版本的 SDK 構(gòu)建多向應(yīng)用呻待,則用戶在多窗口模式中使用應(yīng)用時,系統(tǒng)將強制調(diào)整應(yīng)用大小队腐。 系統(tǒng)將顯示對話框蚕捉,提醒用戶應(yīng)用可能會發(fā)生異常。 系統(tǒng)不會調(diào)整定向應(yīng)用的大胁裉浴迫淹;如果用戶嘗試在多窗口模式下打開定向應(yīng)用,應(yīng)用將全屏顯示为严。
android:resizeableActivity```
在清單的 **<activity>或 <application>**節(jié)點中設(shè)置該屬性敛熬,啟用或禁用多窗口顯示:
android:resizeableActivity=["true" | "false"]```
如果該屬性設(shè)置為 true,Activity 將能以分屏和自由形狀模式啟動第股。 如果此屬性設(shè)置為 false荸型,Activity 將不支持多窗口模式。** 如果該值為 false炸茧,且用戶嘗試在多窗口模式下啟動 Activity瑞妇,該 Activity 將全屏顯示。**
如果您的應(yīng)用面向 Android N梭冠,但未對該屬性指定值辕狰,則該屬性的值默認設(shè)為 true。
android:supportsPictureInPicture
在清單文件的 <activity>節(jié)點中設(shè)置該屬性控漠,指明 Activity 是否支持畫中畫顯示蔓倍。 如果 android:resizeableActivity為 false悬钳,將忽略該屬性。
android:supportsPictureInPicture=["true" | "false"]```
#####布局屬性
對于 Android N偶翅,<layout> 清單元素支持以下幾種屬性默勾,這些屬性影響 Activity 在多窗口模式中的行為:
######android:defaultWidth
以自由形狀模式啟動時 Activity 的默認寬度。
######android:defaultHeight
以自由形狀模式啟動時 Activity 的默認高度聚谁。
######android:gravity
以自由形狀模式啟動時 Activity 的初始位置母剥。請參閱 Gravity 參考資料,了解合適的值設(shè)置形导。
######android:minimalHeight环疼、android:minimalWidth
分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動分界線朵耕,使 Activity 尺寸低于指定的最小值炫隶,系統(tǒng)會將 Activity 裁剪為用戶請求的尺寸。
例如阎曹,以下節(jié)點顯示了如何指定 Activity 在自由形狀模式中顯示時 Activity 的默認大小伪阶、位置和最小尺寸:
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" />
</activity>
#####在多窗口模式中運行應(yīng)用
Android N 添加了新功能,以支持可在多窗口模式中運行的應(yīng)用处嫌。
######多窗口模式中被禁用的功能
在設(shè)備處于多窗口模式中時望门,某些功能會被禁用或忽略,因為這些功能對與其他 Activity 或應(yīng)用共享設(shè)備屏幕的 Activity 而言沒有意義锰霜。 此類功能包括:
某些[系統(tǒng) UI](https://developer.android.com/training/system-ui/index.html) 自定義選項將被禁用筹误;例如,在非全屏模式中癣缅,應(yīng)用無法隱藏狀態(tài)欄厨剪。
系統(tǒng)將忽略對 [android:screenOrientation](https://developer.android.com/guide/topics/manifest/activity-element.html#screen)屬性所作的更改。
######多窗口變更通知和查詢
[Activity](https://developer.android.com/reference/android/app/Activity.html)類中添加了以下新方法友存,以支持多窗口顯示祷膳。 有關(guān)各方法的詳細信息,請參閱 [N Preview SDK 參考](https://developer.android.com/preview/setup-sdk.html#docs-dl)屡立。
######Activity.isInMultiWindowMode()
調(diào)用該方法以確認 Activity 是否處于多窗口模式直晨。
######Activity.isInPictureInPictureMode()
調(diào)用該方法以確認 Activity 是否處于畫中畫模式。
>**注:**畫中畫模式是多窗口模式的特例膨俐。 如果 myActivity.isInPictureInPictureMode()
返回 true勇皇,則 myActivity.isInMultiWindowMode()
也返回 true。
######Activity.onMultiWindowModeChanged()
Activity 進入或退出多窗口模式時系統(tǒng)將調(diào)用此方法焚刺。 在 Activity 進入多窗口模式時敛摘,系統(tǒng)向該方法傳遞 true 值,在退出多窗口模式時乳愉,則傳遞 false 值兄淫。
######Activity.onPictureInPictureModeChanged()
Activity 進入或退出畫中畫模式時系統(tǒng)將調(diào)用此方法屯远。 在 Activity 進入畫中畫模式時,系統(tǒng)向該方法傳遞 true 值捕虽,在退出畫中畫模式時慨丐,則傳遞 false 值。
每個方法還有 Fragment 版本泄私,例如 Fragment.isInMultiWindowMode()房揭。
######進入畫中畫模式
如需在畫中畫模式中啟動 Activity,請調(diào)用新方法 Activity.enterPictureInPictureMode()
挖滤。 如果設(shè)備不支持畫中畫模式崩溪,則此方法無效浅役。 如需了解詳細信息斩松,請參閱[畫中畫](https://developer.android.com/guide/topics/ui/picture-in-picture.html)文檔。
#####在多窗口模式中啟動新 Activity
在啟動新Activity 時觉既,用戶可以提示系統(tǒng)如果可能惧盹,應(yīng)將新 Activity 顯示在當(dāng)前 Activity 旁邊。 要執(zhí)行此操作瞪讼,可使用標(biāo)志**Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT**钧椰。傳遞此標(biāo)志將請求以下行為:
1.如果設(shè)備處于分屏模式,系統(tǒng)會嘗試在啟動系統(tǒng)的 Activity 旁創(chuàng)建新 Activity符欠,這樣兩個 Activity 將共享屏幕嫡霞。 系統(tǒng)并不一定能實現(xiàn)此操作,但如果可以希柿,系統(tǒng)將使兩個 Activity 處于相鄰的位置诊沪。
2.如果設(shè)備不處于分屏模式,則該標(biāo)志無效曾撤。
如果設(shè)備處于自由形狀模式端姚,則在啟動新 Activity 時,用戶可通過調(diào)用 ActivityOptions.setLaunchBounds()
指定新 Activity 的尺寸和屏幕位置挤悉。 如果設(shè)備不處于多窗口模式渐裸,則該方法無效。
>**注:**如果您在任務(wù)棧中啟動 Activity装悲,該 Activity 將替換屏幕上的 Activity昏鹃,并繼承其所有的多窗口屬性。 如果要在多窗口模式中以單獨的窗口啟動新 Activity诀诊,則必須在新的任務(wù)棧中啟動此 Activity盆顾。
#####支持拖放
用戶可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間[拖放](https://developer.android.com/guide/topics/ui/drag-drop.html)數(shù)據(jù) (在此之前,用戶只能在一個 Activity 內(nèi)部拖放數(shù)據(jù))畏梆。 因此您宪,如果您的應(yīng)用目前不支持拖放功能奈懒,您可以在其中添加此功能。
N Preview SDK 擴展了 [android.view
](https://developer.android.com/reference/android/view/package-summary.html) 軟件包宪巨,以支持跨應(yīng)用拖放磷杏。 有關(guān)以下類和方法的詳細信息,請參閱 [N Preview SDK 參考](https://developer.android.com/preview/setup-sdk.html#docs-dl)捏卓。
######android.view.DropPermissions
令牌對象极祸,負責(zé)指定對接收拖放數(shù)據(jù)的應(yīng)用授予的權(quán)限。
######View.startDragAndDrop()
[View.startDrag()](https://developer.android.com/reference/android/view/View.html#startDrag(android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int)) 的新別名怠晴。要啟用跨 Activity 拖放遥金,請傳遞新標(biāo)志 View.DRAG_FLAG_GLOBAL。 如需對接收拖放數(shù)據(jù)的 Activity 授予 URI 權(quán)限蒜田,可根據(jù)情況傳遞新標(biāo)志 View.DRAG_FLAG_GLOBAL_URI_READ或 View.DRAG_FLAG_GLOBAL_URI_WRITE稿械。
######View.cancelDragAndDrop()
取消當(dāng)前正在進行的拖動操作。只能由發(fā)起拖動操作的應(yīng)用調(diào)用冲粤。
######View.updateDragShadow()
替換當(dāng)前正在進行的拖動操作的拖動陰影美莫。只能由發(fā)起拖動操作的應(yīng)用調(diào)用。
######Activity.requestDropPermissions()
請求使用 [DragEvent](https://developer.android.com/reference/android/view/DragEvent.html)中包含的[ClipData](https://developer.android.com/reference/android/content/ClipData.html) 傳遞的內(nèi)容 URI 的權(quán)限梯捕。
#####測試應(yīng)用的多窗口支持
無論您是否針對 Android N 更新應(yīng)用厢呵,都應(yīng)驗證應(yīng)用在多窗口模式下的行為,以防用戶嘗試在運行 Android N 的設(shè)備上以多窗口模式啟動應(yīng)用傀顾。
######配置測試設(shè)備
如果在設(shè)備上安裝 Android N襟铭,則將自動支持分屏模式。
#####如果應(yīng)用并非使用 N Preview SDK 構(gòu)建
如果您的應(yīng)用不是使用 N Preview SDK 構(gòu)建的短曾,則用戶嘗試在多窗口模式中使用應(yīng)用時寒砖,系統(tǒng)將強制調(diào)整應(yīng)用大小,除非應(yīng)用進行了定向聲明错英。
如果您的應(yīng)用沒有進行定向聲明入撒,則應(yīng)在運行 Android N 的設(shè)備上啟動應(yīng)用,并嘗試將應(yīng)用切換到分屏模式椭岩。 驗證并確保在強制調(diào)整應(yīng)用大小時用戶體驗可接受茅逮。
如果應(yīng)用進行了定向聲明,則應(yīng)嘗試將應(yīng)用切換到多窗口模式判哥。 驗證并確保執(zhí)行此操作后献雅,應(yīng)用仍保持全屏模式。
#####如果支持多窗口模式
如果您的應(yīng)用是使用 N Preview SDK 構(gòu)建的塌计,且未禁用多窗口支持挺身,則分別在分屏和自由形狀模式下驗證以下行為。
1.在全屏模式下啟動應(yīng)用锌仅,然后通過長按 Overview 按鈕切換到多窗口模式章钾。 驗證并確保應(yīng)用正常切換墙贱。
2.直接在多窗口模式中啟動應(yīng)用,驗證并確保應(yīng)用正常啟動贱傀。 您可以按一下 Overview 按鈕惨撇,再長按應(yīng)用的標(biāo)題欄,并將其拖動到屏幕上任一突出顯示的區(qū)域府寒,從而在多窗口模式中啟動應(yīng)用魁衙。
3.拖動分界線,在分屏模式中調(diào)整應(yīng)用的大小株搔。 驗證并確保應(yīng)用正常調(diào)整大小且未崩潰剖淀,并且必要的 UI 元素仍可見。
4.如果您指定了應(yīng)用的最小尺寸纤房,請嘗試將應(yīng)用尺寸調(diào)整到低于最小值纵隔。 驗證并確保無法將應(yīng)用尺寸調(diào)整到低于指定最小值。
5.完成所有測試后帆卓,驗證并確保應(yīng)用性能可以接受巨朦。例如米丘,驗證并確保調(diào)整應(yīng)用大小后更新 UI 沒有長時間的滯后剑令。
#####測試檢查單
要在多窗口模式中驗證應(yīng)用性能,請執(zhí)行以下操作拄查。 除非另有說明吁津,否則請分別在分屏和多窗口模式中執(zhí)行以下操作。
進入和退出多窗口模式堕扶。
從您的應(yīng)用切換到另一個應(yīng)用碍脏,驗證并確保應(yīng)用在非活動但可見的狀態(tài)下正常運行。 例如稍算,如果您的應(yīng)用在播放視頻典尾,則驗證并確保在用戶與另一個應(yīng)用交互時視頻仍在繼續(xù)播放。
在分屏模式中糊探,嘗試移動分界線钾埂,放大或縮小應(yīng)用。 分別在左右和上下并排顯示模式中嘗試這些操作科平。 驗證并確保應(yīng)用不會崩潰褥紫,主要功能可見,且調(diào)整操作不需要過長時間瞪慧。
快速連續(xù)執(zhí)行幾次調(diào)整操作髓考。驗證并確保應(yīng)用不會崩潰或出現(xiàn)內(nèi)存泄漏。 有關(guān)檢查應(yīng)用內(nèi)存使用率的信息弃酌,請參閱[查看內(nèi)存使用率](https://developer.android.com/tools/debugging/debugging-memory.html)氨菇。
在多個不同窗口配置中正常使用應(yīng)用儡炼,驗證并確保應(yīng)用正常運行。 驗證并確保文本可讀查蓉,且 UI 元素大小正常射赛,不影響交互。
#####如果已禁用多窗口支持
如果您通過設(shè)置 android:resizableActivity="false"
禁用了多窗口支持奶是,則應(yīng)在運行 Android N 的設(shè)備上啟動應(yīng)用楣责,并嘗試將應(yīng)用切換到自由形狀和分屏模式。 驗證并確保執(zhí)行此操作后聂沙,應(yīng)用仍保持全屏模式秆麸。