天天看點

Android N7.0多視窗适配開發指導

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也能繼承該屬性值,即也能支援多視窗顯示。

Android N7.0多視窗适配開發指導

如圖所示,若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配置不同值,則對分屏模式的支援程度也不同,具體見下表:

Android N7.0多視窗适配開發指導

注: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. 1、  全屏下啟動應用,長按Recent啟動多視窗,驗證應用是否能正常切換到多視窗下顯示。
  2. 2、  全屏下按Recent顯示最近任務清單,拖拽應用标題欄到螢幕高亮區域,驗證應用是否能

    正常在多視窗下顯示。

  3. 3、  拖動分割線,對視窗大小縮放,驗證UI是否顯示正常,功能是否能正常使用。
  4. 4、  如果應用定義minimalSize,則驗證視窗大小是否能縮放到低于minimalSize值。
  5. 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