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 進(jìn)入多窗口模式。
若用戶長按 Overview 按鈕,設(shè)備上的當(dāng)前 Activity 將進(jìn)入多窗口模式,同時將打開 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
屬性或默認(rèn) windowBackgroundFallback
樣式屬性指定的顏色暫時填充該區(qū)域。
針對多窗口模式配置應(yīng)用
如果您的應(yīng)用面向 Android N,您可以對應(yīng)用的 Activity 是否支持多窗口顯示以及顯示方式進(jìn)行配置。 您可以在清單文件中設(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,但未對該屬性指定值,則該屬性的值默認(rèn)設(shè)為 true。
android:supportsPictureInPicture
在清單文件的 <activity>節(jié)點中設(shè)置該屬性,指明 Activity 是否支持畫中畫顯示。 如果 android:resizeableActivity為 false,將忽略該屬性。
android:supportsPictureInPicture=["true" | "false"]```
#####布局屬性
對于 Android N,<layout> 清單元素支持以下幾種屬性,這些屬性影響 Activity 在多窗口模式中的行為:
######android:defaultWidth
以自由形狀模式啟動時 Activity 的默認(rèn)寬度。
######android:defaultHeight
以自由形狀模式啟動時 Activity 的默認(rèn)高度。
######android:gravity
以自由形狀模式啟動時 Activity 的初始位置。請參閱 Gravity 參考資料,了解合適的值設(shè)置。
######android:minimalHeight、android:minimalWidth
分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動分界線,使 Activity 尺寸低于指定的最小值,系統(tǒng)會將 Activity 裁剪為用戶請求的尺寸。
例如,以下節(jié)點顯示了如何指定 Activity 在自由形狀模式中顯示時 Activity 的默認(rèn)大小、位置和最小尺寸:
<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)各方法的詳細(xì)信息,請參閱 [N Preview SDK 參考](https://developer.android.com/preview/setup-sdk.html#docs-dl)。
######Activity.isInMultiWindowMode()
調(diào)用該方法以確認(rèn) Activity 是否處于多窗口模式。
######Activity.isInPictureInPictureMode()
調(diào)用該方法以確認(rèn) Activity 是否處于畫中畫模式。
>**注:**畫中畫模式是多窗口模式的特例。 如果 myActivity.isInPictureInPictureMode()
返回 true,則 myActivity.isInMultiWindowMode()
也返回 true。
######Activity.onMultiWindowModeChanged()
Activity 進(jìn)入或退出多窗口模式時系統(tǒng)將調(diào)用此方法。 在 Activity 進(jìn)入多窗口模式時,系統(tǒng)向該方法傳遞 true 值,在退出多窗口模式時,則傳遞 false 值。
######Activity.onPictureInPictureModeChanged()
Activity 進(jìn)入或退出畫中畫模式時系統(tǒng)將調(diào)用此方法。 在 Activity 進(jìn)入畫中畫模式時,系統(tǒng)向該方法傳遞 true 值,在退出畫中畫模式時,則傳遞 false 值。
每個方法還有 Fragment 版本,例如 Fragment.isInMultiWindowMode()。
######進(jìn)入畫中畫模式
如需在畫中畫模式中啟動 Activity,請調(diào)用新方法 Activity.enterPictureInPictureMode()
。 如果設(shè)備不支持畫中畫模式,則此方法無效。 如需了解詳細(xì)信息,請參閱[畫中畫](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 擴(kuò)展了 [android.view
](https://developer.android.com/reference/android/view/package-summary.html) 軟件包,以支持跨應(yīng)用拖放。 有關(guān)以下類和方法的詳細(xì)信息,請參閱 [N Preview SDK 參考](https://developer.android.com/preview/setup-sdk.html#docs-dl)。
######android.view.DropPermissions
令牌對象,負(fù)責(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)前正在進(jìn)行的拖動操作。只能由發(fā)起拖動操作的應(yīng)用調(diào)用。
######View.updateDragShadow()
替換當(dāng)前正在進(jìn)行的拖動操作的拖動陰影。只能由發(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)用進(jìn)行了定向聲明。
如果您的應(yīng)用沒有進(jìn)行定向聲明,則應(yīng)在運行 Android N 的設(shè)備上啟動應(yīng)用,并嘗試將應(yīng)用切換到分屏模式。 驗證并確保在強制調(diào)整應(yīng)用大小時用戶體驗可接受。
如果應(yīng)用進(jìn)行了定向聲明,則應(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í)行以下操作。
進(jìn)入和退出多窗口模式。
從您的應(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)用仍保持全屏模式。