Andr oid 多窗 口编程
多窗口支持
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)頁,同時在右邊寫郵件。 用戶體驗(yàn)取決于設(shè)備:
運(yùn)行 Android N 的手持設(shè)備具有分屏模式。 在此模式中,系統(tǒng)以左右并排或上下并排的方式分屏顯示兩個應(yīng)用。 用戶可以拖動兩個應(yīng)用之間的分界線,放大其中一個應(yīng)用,同時縮小另一個。
在運(yùn)行 Android N 的 Nexus Player 上 ,應(yīng)用能以畫中畫模式顯示,即在用戶瀏覽網(wǎng)頁或與其他應(yīng)用交互的同時繼續(xù)顯示內(nèi)容。
較大設(shè)備的制造商可選 擇啟用自由形狀模式,在該模式中,用戶可以自由調(diào)整各 Activity 的尺寸。 若制造商啟用此功能,設(shè)備將同時具有自由形狀模式和分屏模式。
圖 1. 兩個應(yīng)用在分屏模式中左 右并排顯示。
用戶可以通過以 下方式切換到多窗口模式:
若用戶打開 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ùn)行時變更中所述,用戶使用多窗口模式顯示應(yīng)用時,系統(tǒng)將通知 Activity 發(fā)生配置變更。 這也會發(fā)生在當(dāng)用戶調(diào)整應(yīng)用大小,或?qū)?yīng)用恢復(fù)到全屏模式時。 該變更與系統(tǒng)通知應(yīng)用設(shè)備從縱向模式切換到橫向模式時的 Activity 生命周期影響基本相同,但設(shè)備不僅僅是交換尺寸,而是會變更尺寸。 如處理運(yùn)行時變更中所述,您的 Activity 可以自行處理配置變更,或允許系統(tǒng)銷毀 Activity,并以新的尺寸重新創(chuàng)建該 Activity。?
如果用戶調(diào)整窗口大小,并在任意維度放大窗口尺寸,系統(tǒng)將調(diào)整 Activity 以匹配用戶操作,同時根據(jù)需要發(fā)布運(yùn)行時變更。 如果應(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)將強(qiáng)制調(diào)整應(yīng)用大小。 系統(tǒng)將顯示對話框,提醒用戶應(yīng)用可能 會發(fā)生異常。 系統(tǒng)不會調(diào)整定向應(yīng)用的大小;如果用戶嘗試在多窗口模式下打開定向應(yīng)用,應(yīng)用將全屏顯示。
android:resizeableActivity 在清單的 <activity> 或 <applicat ion> 節(jié)點(diǎn)中設(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é)點(diǎn)中設(shè)置該屬性,指明 Activity 是否支持畫中畫顯示。 如果 android:resizeableActivity 為 false,將忽略該屬性。
android:supportsPictureInPicture=["true" | "false"]
布局屬性
對于 Android layout 清單元素 支持以下幾種屬性,這些屬性影響 Activity 在多窗口模式中的行為:
android:defa ultWidth
以自由形狀模式啟動時 Activity 的默認(rèn)寬度。
android:defaultHe ight
以自由形狀模 式啟動時 Activity 的默認(rèn)高度。
android:gravity
以自由形狀模式啟動時 Activity 的初始位置。請參閱 Gravity 參考資料,了解合適的值設(shè)置。
android:minimalHeight、android:minimalWidth
分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動分界線,使 Activity 尺寸低于指定的最小值,系統(tǒng)會將 Activity 裁剪為用戶請求的尺寸。
例如,以下節(jié)點(diǎn)顯示了如何指定 Activity 在自由形狀模式中顯示時 Activity 的默認(rèn)大小、位置和最小尺寸:
在多窗口模式中運(yùn)行應(yīng)用
Android N 添加了新功能,以支持可在多窗口模式中運(yùn)行的應(yīng)用。
多窗口模式中被禁用的功能
在設(shè)備處于多窗口模式中時,某 些功能會被禁用或忽略,因?yàn)檫@些功能對與其他 Activity 或應(yīng)用共享設(shè)備屏幕的 Activity 而言沒有意義。 此類功能包括:
某些系統(tǒng) UI 自定義選項(xiàng) 將被禁用;例如,在非全屏模式中,應(yīng)用無法隱藏狀態(tài)欄。
系統(tǒng)將忽略對 android:screenOrientation 屬性所作的更改。
多窗口變更通知和查詢
Activity 類中添加了以下新方法,以支持多窗口顯示。
Activity.isInMultiWindow Mode()
調(diào)用該方法以確認(rèn) Activity 是否處于多窗口模式。
Activity.isInPictureInPictureM ode()
調(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ì)信息,請參閱畫中畫文檔。
在多窗口模式中啟動新 Activity
在啟動新 Activity 時,用戶可以提示系統(tǒng)如果可能,應(yīng)將新 Activity 顯示在當(dāng)前 Activity 旁邊。 要執(zhí)行此操作,可使用標(biāo)志 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。 傳遞此標(biāo)志將請求以下行為:
如果設(shè)備處于分屏模式,系統(tǒng)會嘗試在啟動系統(tǒng)的 Activity 旁創(chuàng)建新 Activity,這樣兩個 Activity 將共享屏幕。 系統(tǒng)并不一定能實(shí)現(xiàn)此操作,但如果可以,系統(tǒng)將使兩個 Activity ?處于相鄰的位置。
如果設(shè)備不處于分屏模式,則該標(biāo)志無效。
如果設(shè)備處于自由形狀模式,則在啟動新 Activity 時,用戶可通過調(diào)用 ActivityOptions.setLaunchBounds() 指定新 Activity 的尺寸和屏幕位置。 如果設(shè)備不處于多窗口模式,則該方法無效。
注:如果您在任務(wù)棧中啟動 Activity,該 Activity 將替換屏幕上的 Activity,并繼承其所有的多窗口屬性。 如果要在多窗口模式中以單獨(dú)的窗口啟動新 Activity,則必須在新的任務(wù)棧中啟動此 Activity。
支持拖放
用戶可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間拖放數(shù)據(jù) (在此之前,用戶只能在一個 Activity 內(nèi)部拖放數(shù)據(jù))。 因此,如果您的應(yīng)用目前不支持拖放功能,您可以在其中添加此功能。
N Preview SDK 擴(kuò)展了 android.view 軟件包,以支持跨應(yīng)用拖放。
android.view.DropPermissions?
令牌對象,負(fù)責(zé)指定對接收拖放數(shù)據(jù)的應(yīng)用授予的權(quán)限。
View.startDragAndDrop()
View.startDrag() 的新別名。要啟用跨 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 中包含的 ClipData 傳遞的內(nèi)容 URI 的權(quán)限。
測試應(yīng)用的多窗口支持
無論您是否針對 Android N 更新應(yīng)用,都應(yīng)驗(yàn)證應(yīng)用在多窗口模式下的行為,以防用戶嘗試在運(yùn)行 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)將強(qiáng)制調(diào)整應(yīng)用大小,除非應(yīng)用進(jìn)行了定向聲明。
如果您的應(yīng)用沒有進(jìn)行定向聲明,則應(yīng)在運(yùn)行 Android N 的設(shè)備上啟動應(yīng)用,并嘗試將應(yīng)用切換到分屏模式。 驗(yàn)證并確保在強(qiáng)制調(diào)整應(yīng)用大小時用戶體驗(yàn)可接受。
如果應(yīng)用進(jìn)行了定向聲明,則應(yīng)嘗試將應(yīng)用切換到多窗口模式。 驗(yàn)證并確保執(zhí)行此操作后,應(yīng)用仍保持全屏模式。
如果支持多窗口模式
如果您的應(yīng)用是使用 N Preview SDK 構(gòu)建的,且未禁用多窗口支持,則分別在分屏和自由形狀模式下驗(yàn)證以下行為。
在全屏模式下啟動應(yīng)用,然后通過長按 Overview 按鈕切換到多窗口模式。 驗(yàn)證并確保應(yīng)用正常切換。
直接在多窗口模式中啟動應(yīng)用,驗(yàn)證并確保應(yīng)用正常啟動。 您可以按一下 Overview 按鈕,再長按應(yīng)用的標(biāo)題欄,并將其拖動到屏幕上任一突出顯示的區(qū)域,從而在多窗口模式中啟動應(yīng)用。
拖動分界線,在分屏模式中調(diào)整應(yīng)用的大小。 驗(yàn)證并確保應(yīng)用正常調(diào)整大小且未崩潰,并且必要的 UI 元素仍可見。
如果您指定了應(yīng)用的最小尺寸,請嘗試將應(yīng)用尺寸調(diào)整到低于最小值。 驗(yàn)證并確保無法將應(yīng)用尺寸調(diào)整到低于指定最小值。
完成所有測試后,驗(yàn)證并確保應(yīng)用性能可以接受。例如,驗(yàn)證并確保調(diào)整應(yīng)用大小后更新 UI 沒有長時間的滯后。
測試檢查單
要在多窗口模式中驗(yàn)證應(yīng)用性能,請執(zhí)行以下操作。 除非另有說明,否則請分別在分屏和多窗口模式中執(zhí)行以下操作。
進(jìn)入和退出多窗口模式。
從您的應(yīng)用切換到另一個應(yīng)用,驗(yàn)證并確保應(yīng)用在非活動但可見的狀態(tài)下正常運(yùn)行。 例如,如果您的應(yīng)用在播放視頻,則驗(yàn)證并確保在用戶與另一個應(yīng)用交互時視頻仍在繼續(xù)播放。
在分屏模式中,嘗試移動分界線,放大或縮小應(yīng)用。 分別在左右和上下并排顯示模式中嘗試這些操作。 驗(yàn)證并確保應(yīng)用不會崩潰,主要功能可見,且調(diào)整操作不需要過長時間。
快速連續(xù)執(zhí)行幾次調(diào)整操作。驗(yàn)證并確保應(yīng)用不會崩潰或出現(xiàn)內(nèi)存泄漏。 有關(guān)檢查應(yīng)用內(nèi)存使用率的信息,請參閱查看內(nèi)存使用率。
在多個不同窗口配置中正常使用應(yīng)用,驗(yàn)證并確保應(yīng)用正常運(yùn)行。 驗(yàn)證并確保文本可讀,且 UI 元素大小正常,不影響交互。
如果已禁用多窗口支持
如果您通過設(shè)置 android:resizableActivity="false" 禁用了多窗口支持,則應(yīng)在運(yùn)行 Android N 的設(shè)備上啟動應(yīng)用,并嘗試將應(yīng)用切換到自由形狀和分屏模式。 驗(yàn)證并確保執(zhí)行此操作后,應(yīng)用仍保持全屏模式。
原地址:https://gold.xitu.io/post/58440d7d79bc440065bb32e1? 支持下!
總結(jié)
以上是生活随笔為你收集整理的Andr oid 多窗 口编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机office使用 手机office不
- 下一篇: 京东价格监控软件开发技术探讨十五:通过酷