Android7.0新特性介紹(一)——多視窗支援
Android7.0新特性
1 多視窗支援 (在手機和平板中叫分屏模式,最多就倆視窗)
在 Android N 中,Google引入了一個新的而且非常需要的多工處理功能 — 多視窗支援。
1.1 進入多視窗模式
- 啟動App,長按系統導航欄右下角的小方塊(Google官方把這個叫做Overview Button),確保你的App可以進入分屏模式,且尺寸改變後仍然能正常工作。
- 啟動工作管理員(即單擊右下角的小方塊),然後長按你App的標題欄,將它拖動到螢幕上的高亮區域。確保你的App可以進入分屏模式,且尺寸改變後仍然能正常工作。
1.2 多視窗生命週期
多視窗模式不會更改 Activity 生命週期。
在多視窗模式中,在指定時間只有最近與使用者互動過的 Activity 為活動狀態。 該 Activity 將被視為頂級 Activity。 所有其他 Activity 雖然可見,但均處於暫停狀態。 但是,這些已暫停但可見的 Activity 在系統中享有比不可見 Activity 更高的優先順序。 如果使用者與其中一個暫停的 Activity 互動,該 Activity 將恢復,而之前的頂級 Activity 將暫停。
1.3 針對多視窗模式配置應用
如果您的應用面向 Android N,您可以對應用的 Activity 是否支援多視窗顯示以及顯示方式進行配置。 您可以在清單檔案中設定屬性,以控制大小和佈局。 根 Activity 的屬性設定適用於其任務棧中的所有 Activity。 例如,如果根 Activity 已 android:resizeableActivity 設定為 true,則任務棧中的所有 Activity 都將可以調整大小。
注:如果您使用低於 Android N 版本的 SDK 構建多向應用,則使用者在多視窗模式中使用應用時,系統將強制調整應用大小。 系統將顯示對話方塊,提醒使用者應用可能會發生異常。 系統不會調整定向應用的大小;如果使用者嘗試在多視窗模式下開啟定向應用,應用將全屏顯示。
- android:resizeableActivity
在清單的 或 節點中設定該屬性,啟用或禁用多視窗顯示:
android:resizeableActivity=["true" | "false"]
如果該屬性設定為 true,Activity 將能以分屏和自由形狀模式啟動。 如果此屬性設定為 false,Activity 將不支援多視窗模式。 如果該值為 false,且使用者嘗試在多視窗模式下啟動 Activity,該 Activity 將全屏顯示。
如果您的應用面向 Android N,但未對該屬性指定值,則該屬性的值預設設為 true。
注:近期(約2016/10/19)我的Nexus6P收到了一個Android7.0的補丁,安裝補丁後,系統會嘗試使任何App進入多視窗模式,無論設定resizeableActivity與否。
1.4 在多視窗模式中執行應用
Android N 添加了新功能,以支援可在多視窗模式中執行的應用。
1.4.1 多視窗模式中被禁用的功能
在裝置處於多視窗模式中時,某些功能會被禁用或忽略,因為這些功能對與其他 Activity 或應用共享裝置螢幕的 Activity 而言沒有意義。 此類功能包括:
- 某些系統 UI 自定義選項將被禁用;例如,在非全屏模式中,應用無法隱藏狀態列。
- 系統將忽略對 android:screenOrientation 屬性所作的更改。
1.4.2 多視窗變更通知和查詢
boolean Activity.isInMultiWindowMode()
呼叫該方法以確認Activity是否處於多視窗模式Activity.onMultiWindowModeChanged()
Activity 進入或退出多視窗模式時系統將呼叫此方法。 在 Activity 進入多視窗模式時,系統向該方法傳遞 true 值,在退出多視窗模式時,則傳遞 false 值。
注:Fragment也擁有以上方法。
1.5 在多視窗模式種啟動新的Activity
在啟動新 Activity 時,使用者可以提示系統如果可能,應將新 Activity 顯示在當前 Activity 旁邊。 要執行此操作,可使用標誌 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。 傳遞此標誌將請求以下行為:
- 如果裝置處於分屏模式,系統會嘗試在啟動系統的 Activity 旁建立新 Activity,這樣兩個 Activity 將共享螢幕。 系統並不一定能實現此操作,但如果可以,系統將使兩個 Activity 處於相鄰的位置。
- 如果裝置不處於分屏模式,則該標誌無效。
注:如果您在任務棧中啟動 Activity,該 Activity 將替換螢幕上的 Activity,並繼承其所有的多視窗屬性。 如果要在多視窗模式中以單獨的視窗啟動新 Activity,則必須在新的任務棧中啟動此 Activity。
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1.6 支援拖放
使用者可以在兩個 Activity 共享螢幕的同時在這兩個 Activity 之間拖放資料 (在此之前,使用者只能在一個 Activity 內部拖放資料)。 因此,如果您的應用目前不支援拖放功能,您可以在其中新增此功能。 N Preview SDK 擴充套件了 android.view 軟體包,以支援跨應用拖放。 有關以下類和方法的詳細資訊,請參閱 N Preview SDK 參考。View.startDragAndDrop()
View.startDrag() 的新別名。要啟用跨 Activity 拖放,請傳遞新標誌View.DRAG_FLAG_GLOBAL
。 如需對接收拖放資料的 Activity 授予 URI 許可權,可根據情況傳遞新標誌View.DRAG_FLAG_GLOBAL_URI_READ
或View.DRAG_FLAG_GLOBAL_URI_WRITE
。View.cancelDragAndDrop()
只能由拖動發起方呼叫。取消當前正在進行的拖動操作。View.updateDragShadow()
只能由拖動發起方呼叫。給當前正在進行的拖動操作的拖動設定陰影。android.view.DropPermissions
令牌物件,負責指定對接收拖放資料的應用授予的許可權。Activity.requestDropPermissions()
傳遞URI許可權時,需要呼叫這個方法。傳遞的內容儲存在DragEvent
中的ClipData
裡。返回值為前面的android.view.DropPermissions
。
1.7 在分屏模式下測試你的App(開發人員和測試人員都需要了解)
無論您是否針對 Android N 更新應用,都應驗證應用在多視窗模式下的行為,以防使用者嘗試在執行 Android N 的裝置上以多視窗模式啟動應用。
- Android N預設支援分屏模式
- 如果您的應用不是使用 N SDK 構建的,則使用者嘗試在多視窗模式中使用應用時,系統將強制調整應用大小,除非應用進行了定向宣告(android:unresizeableActivity=”true”)。
如果您的應用沒有進行定向宣告,則應在執行 Android N 的裝置上啟動應用,並嘗試將應用切換到分屏模式。 驗證並確保在強制調整應用大小時使用者體驗可接受。
如果應用進行了定向宣告,則應嘗試將應用切換到多視窗模式。 驗證並確保執行此操作後,應用仍保持全屏模式。(前文提及,現已失效)
1.7.1 如果支援多視窗模式
如果您的應用是使用 N SDK 構建的,且未禁用多視窗支援,則在分屏模式下驗證以下行為。
在全屏模式下啟動應用,然後通過長按 Overview 按鈕(螢幕右下角的小方框)切換到多視窗模式。 驗證並確保應用正常切換。
直接在多視窗模式中啟動應用,驗證並確保應用正常啟動。 您可以按一下 Overview 按鈕,再長按應用的標題欄,並將其拖動到螢幕上任一突出顯示的區域,從而在多視窗模式中啟動應用。
拖動分界線,在分屏模式中調整應用的大小。 驗證並確保應用正常調整大小且未崩潰,並且必要的 UI 元素仍可見。
完成所有測試後,驗證並確保應用效能可以接受。例如,驗證並確保調整應用大小後更新 UI 沒有長時間的滯後。
1.7.2 測試檢查單
要在多視窗模式中驗證應用效能,請執行以下操作。 除非另有說明,否則請分別在分屏和多視窗模式中執行以下操作。
進入和退出多視窗模式。
從您的應用切換到另一個應用,驗證並確保應用在非活動但可見的狀態下正常執行。 例如,如果您的應用在播放視訊,則驗證並確保在使用者與另一個應用互動時視訊仍在繼續播放。
在分屏模式中,嘗試移動分界線,放大或縮小應用。 分別在左右和上下並排顯示模式中嘗試這些操作。 驗證並確保應用不會崩潰,主要功能可見,且調整操作不需要過長時間。
快速連續執行幾次調整操作。驗證並確保應用不會崩潰或出現記憶體洩漏。 有關檢查應用記憶體使用率的資訊,請參閱檢視記憶體使用率。
在多個不同視窗配置中正常使用應用,驗證並確保應用正常執行。 驗證並確保文字可讀,且 UI 元素大小正常,不影響互動。
1.7.3 如果已禁用多視窗支援
如果您通過設定 android:resizableActivity=”false” 禁用了多視窗支援,則應在執行 Android N 的裝置上啟動應用,並嘗試將應用切換到自由形狀和分屏模式。 驗證並確保執行此操作後,應用仍保持全屏模式。(前文提及,現已失效。不過測試時,仍可嘗試。)