0 前言背景
本文檔為多視窗适配指導文檔。目前僅重點介紹有關分屏(split-screen)的相關說明,後續逐漸補充其他模式的說明。
使用對象
使用Android平台的研發人員和測試人員等。
适用範圍
該規範适用于基于Android平台的産品開發。
術語定義
規則:程式設計時必須遵守的約定
說明:某個規則的具體解釋
錯誤示例:違背某條規則的例子
正确示例:遵循某條規則的例子
例外情況:相應的規則不适用的場景信任邊界:位于信任邊界之内的所有元件都是被系統本身直接控制的。所有來自不受控的外部系統的連接配接與資料,包括用戶端與第三方系統,都應該被認為是不可信的,要先在邊界處對其校驗,才能允許它們進一步與本系統互動。
非信任代碼:非産品包中的代碼,如通過網絡下載下傳到本地虛拟機中加載并執行的代碼。
1 多視窗介紹
多視窗的定義:螢幕同時顯示多個Activity,并且Activity視窗可在一定範圍内放大縮小。N
版本多視窗支援三種模式:
1.1 分屏(split-screen)模式
支援2個視窗同時顯示(豎屏上下,橫屏左右)
支援視窗縮放功能
1.2 自由(freeform)模式
多個視窗同時顯示 (類似Windows)
支援視窗最大化、關閉、調整大小和位置、自定義标題欄區域
1.3 畫中畫(Picture-in-Picture)模式視窗懸浮在topmost
2 多視窗分屏使用指導2.1如何開啟多視窗分屏
多視窗分屏開啟方式分為以下兩種:
長按Recent啟動
最近任務清單拖拽标題欄到上視窗(豎屏時)或左視窗(橫屏時)
2.2 如何退出多視窗分屏
多視窗分屏退出方式分為以下兩種:
長按Recent退出
豎屏時,拖動分割線到頂部或底部退出。橫屏時,拖動分割線到左側或右側退出。
2.3 如何縮放分屏視窗大小随視窗寬高變化,動态切換資源,如layout方向;豎屏支援3檔,橫屏支援1檔
3 多視窗開發注意事項
3.1如何配置是否支援多視窗
對于targetSDKVersion為N,按如下規則配置:
說明:N版本API Activity新增resizeableActivity屬性,用來标示Activity是否支援多視窗。若應用targetSDKVersion為N,則該應用下所有Activity的resizeableActivity屬性均預設為true,即該應用下的所有Activity均能支援多視窗顯示。
若root Activity的resizeableActivity屬性為true,則和root Activity處于同一Task的其他Activity也能繼承該屬性值,即也能支援多視窗顯示。

如圖所示,若Activity1配置resizeableActivity為true,Activity1、Activity2、Activity3均處于同一Task,則Activity2和Activity3均能在多視窗下顯示(即使Activity2和Activity3沒有配置resizeableActivity屬性)。
若Activity2需全屏顯示,則需按以下步驟配置:
1、設定resizeableActivity為false
<activityandroid:name="com.exmaple.Activity2"
android:resizeableActivity="false
2、Activity1啟動Activity2時,設定FLAG_ACTIVITY_NEW_TASK,Activity2運作在單獨的Task,即和Activity1不在同一Task。
Intent intent= newIntent(this,Activity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
對于targetSDKVersion低于N,注意如下事項:說明:targetSDKVersion低于N版本的應用,且能支援橫豎屏轉向(入口Activity),則能支援分屏模式(split-screen),并Toast提示“app may not work with split-screen”。否則,全屏顯示,并Toast提示“this app does not support multi-window”。targetSDKVersion低于N版本的應用,對應Activity屬性screenOrientation配置不同值,則對分屏模式的支援程度也不同,具體見下表:
注:Y支援分屏N不支援分屏
3.2 多視窗下Activity生命周期注意事項
說明:N版本多視窗下運作的兩個同時可見的Activity,隻有一個處于Resumed狀态,有别于華為多視窗的方案(兩個可見的Activity同時處于Resumed狀态)。如果是視訊、社交、浏覽器等類型的應用,在N版本裝置多視窗下運作,建議在onStart/onStop中處理play/pause邏輯,而不要在onResume/onPause方法中處理,以保證:
1、 視訊類應用在失去焦點時,能正常播放
android:resizeableActivity="false" />
Intent intent=newInten
2、 社交類應用在失去焦點時,能繼續收到消息、實時重新整理
3、 浏覽器類應用在失去焦點時,能正常播放網頁視訊、動畫等其他類型的應用,在保證使用者體驗的前提下,可根據自身業務邏輯處理。
3.3 如何知道是否處于多視窗模式
說明:N版本API Activity類新增inMultiWindow方法,判斷目前Activity是否處于多視窗模
式(split-screen,freeform,pip)
3.4 如何知道是否處于PiP模式
說明:N版本API Activity類新增inPictureInPicture方法,判斷目前Activity是否處于PiP模式。
3.5 如何監聽是否進入多視窗模式
說明:N版本API Activity類新增onMultiWindowModeChanged方法,監聽Activity是否進入
多視窗模式。
}
注:inMultiWindow為true,則表示處于多視窗模式(split-screen,freeform,pip);否則,已退出多視窗模式。
3.6 如何監聽是否進入PiP模式
說明:N版本API Activity類新增onPictureInPictureChanged方法,監聽Activity是否進入
PiP模式。
注:inPictureInPicture為true,則表示處于Pip模式;否則,已退出Pip模式。如果Activity要進入PiP模式,可通過調用 方法,使Activity自身
進入PiP模式,前提條件是該Activity的 為true。
3.7 分屏模式下同應用的兩個不同Activity可支援相鄰顯示
說明:N版本API Intent類新增Flag:FLAG_ACTIVITY_LAUNCH_ADJACENT,該Flag僅用于多視窗下的分屏模式(split-screen)。分屏模式下,若上視窗Activity1啟動Activity2時設定FLAG_ACTIVITY_LAUNCH_ADJACENT,則Activity2在下視窗下顯示,同時上視窗依然顯示Activity1,即兩者相鄰顯示。使用時FLAG_ACTIVITY_LAUNCH_ADJACENT要結合FLAG_ACTIVITY_NEW_TASK使用,以確定新Activity運作在單獨的Task中。
startActivity(intent);
Android N7.0多視窗适配開發指導
3.8 多視窗Configuration變化注意事項
說明:多視窗下對應用視窗大小縮放,會觸發Configuration變化,可能的變化有screenSize、smallestScreenSize、layoutDirection、screenLayout、orientation,建議Activity的manifest配置configChanges,否則Activity将被銷毀重建,可能導緻卡頓和跟手性差。
示例代碼:
3.9 如何設定多視窗縮放時Window背景
說明:多視窗縮放時,通過設定R.styleable#Window_windowBackground,來設定視窗背景樣式。若未設定,則預設讀取R.styleable#Window_windowBackgroundFallback值。示例代碼:
<activity
android:name=".MyActivity"
android:configChanges="screenSize|smallestScreenSize|
layoutDirection|screenLayout|orientation"/>
<stylename="MyTheme"parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Drawable to use in the background while the window is resizing on
Android N. -->
<itemname="android:windowBackgroundFallback">@color/green</item>
<itemname="android:windowBackground">@color/green</item>
</style>
3.10 如何通過 layout設定多視窗布局
說明:N版本API新增layout布局,對layout屬性值進行設定,可配置activity的顯示位置和視窗大小。
defaultHeight: freeform模式下,activity的初始高度值
defaultWidth: freeform模式下,activity的初始寬度值
gravity: freeform模式下,activity的初始位置屬性。minimalSize:freeform或split-screen模式下,activity的最小高度和寬度值。split-screen模式下,如果移動分隔線對視窗縮放,若縮放大小低于minimalSize,則系統強制對activity進行裁剪壓縮。
示例代碼:
3.11 如何通過代碼設定多視窗布局說明:同3.10
示例代碼:
<activityandroid:name=".MyActivity">
<layoutandroid:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp"/>
</activity>
// Define the bounds.
Rect bounds = new Rect(500, 300, 100, 0);
// Set the bounds as an activity option.
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchBounds(bounds);
Intent intent = new Intent(this, MyActivity.class);
startActivity(intent, options.toBundle());
3.12 多視窗模式應用特性變化注意事項
說明:多視窗下Activity以下特性變化将不再生效:
系統UI(status bar、nav bar...)的自定義和可見度變化,不再生效
WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER,設定桌面背景為應用背景不
再生效
沉浸式Immersive Mode,不再生效
對Activity屬性android:screenOrientation設定,不再生效。比如ActivityA已運作在多視窗
下,同時AndroidManifest.xml中對Activity A的android:screenOrientation設定為portrait,實際情況是多視窗下Activity A不限制轉向,橫豎屏均顯示。
3.13 自由模式下 caption/title區域如何顯示content說明:自由模式下,右上角可顯示caption/title區域,如果應用需要在caption/title顯示content
(類似Chrome頁籤),可調用N版本API Activity類新增overlayWithDecorCaption方法。
3.14 應用如何适配多視窗動态變化布局
說明:應用在多視窗下按如下原則驗證适配是否正常:
- 1、 全屏下啟動應用,長按Recent啟動多視窗,驗證應用是否能正常切換到多視窗下顯示。
-
2、 全屏下按Recent顯示最近任務清單,拖拽應用标題欄到螢幕高亮區域,驗證應用是否能
正常在多視窗下顯示。
- 3、 拖動分割線,對視窗大小縮放,驗證UI是否顯示正常,功能是否能正常使用。
- 4、 如果應用定義minimalSize,則驗證視窗大小是否能縮放到低于minimalSize值。
- 5、 性能測試,驗證視窗縮放時,UI重繪是否存在性能問題。
以Nexus 6P為例,在豎屏可進行3個檔位縮放,橫屏固定1個檔位(檔位可配置)。在滑動條拖動時,layout的大小會發生變化;方向可能會變化(取決于長寬比較),将導緻與螢幕方向不一緻。Activity的configuration會變化(參考3.8),res資源目錄可能會發生切換(取決于res配置)。
應用應盡量使用一套布局(或橫豎兩套)來做界面适配,相容多種layout尺寸。若應用在不同檔位顯示時,存在UI顯示異常(比如布局擠壓、控件被遮擋等),可參考對應檔位的layout做資源适配。例如下圖Nexus 6p,可在sw320目錄做适配,滿足橫屏和豎屏的50%檔:
影響類:Activity
調用示例:overlayWithDecorCaption(true)
Nexus 6P | 分屏視窗調整時layout變化 |
豎屏 | 50%檔:sw324dp,放大1檔:sw411dp,縮小1檔:sw213dp |
橫屏 | 50%檔:sw336dp |
參考資料
1. http://developer.android.com/preview/samples.html
2. https://www.google.com/design/spec/layout/split-screen.html#split-screen-layout