1. 程式人生 > >ANDROID N 分屏設置

ANDROID N 分屏設置

重新 單擊 高亮 star sage 周期 拖拽 橫豎 onpause

一 概述
  android N的發布,最大的亮點有2個,原生系統對應用分屏的支持和快捷回復。現在只介紹分屏功能,目前最新的Android N系統支持橫屏時讓兩個APP並排,豎屏時上下排放,而在Android TV上,原生系統也支持APP實現畫中畫。用戶還可以在這兩個App之間拖動數據,例如將一個App的Activity上的文件拖動到另外一個App的Activity中去。
  用戶開啟分屏模式:
  1點擊右下角的方塊,進入任務管理器,長按一個App的標題欄,將其拖入屏幕的高亮區域,這個App金進入了分屏模式。然後在任務管理器中選擇另一個App,單擊它使得這個App也進入分屏模式。
  2打開一個App,然後長按右下角的方塊,此時已經打開的這個App將進入分屏模式。然後在屏幕上的任務管理器中選擇另外一個App,單擊它使得這個App也進入分屏模式。
  3最新發現:下拉通知欄,長按右上角的設置圖標,將開啟隱藏設置功能 “系統界面調諧器”,進入設置界面,最下方有系統界面調諧器選項,進入後選擇 “Other”->“啟用分屏上滑手勢”,就可以從任務管理器上上滑進入分屏模式了。具體操作是 當一個App已經處於全屏模式時,用手指從右下角的小方塊向上滑動 。這個設置將來在正式版可能有變化,所以還是不要太依賴。
二 分屏模式的生命周期
  首先要說明的一點是,分屏模式沒有改變Activity的生命周期。
  官方說法是:在分屏模式下,用戶最近操作、激活過的Activity將被系統視為 topmost 。而其他的Activity都屬於 paused 狀態,即使它是一個對用戶可見的Activity。但是這些可見的處於 paused 狀態的Activity將比那些不可見的處於 paused 狀態的Activity得到更高優先級的響應。當用戶在一個可見的 paused 狀態的Activity上操作時,它將得到恢復 resumed 狀態,並被系統視為 topmost 。而之前那個那個處於 topmost 的Activity將變成 paused 狀態。
  在分屏模式中,一個App可以在對用戶可見的狀態下進入 paused 狀態,這與以往是不同的。所以你的App在處理業務時,也應該知道自己什麽時候應該真正的暫停。例如一個視頻播放器,如果進入了分屏模式,就不應該在 onPaused() 回調中暫停視頻播放,而應該在 onStop() 回調中才暫停視頻,然後在 onStart()回調中恢復視頻播放。關於如何知道自己進入了分屏模式,在 Android N 的Activity API中,增加了一個 void onMultiWindowChanged(boolean inMultiWindow) 回調,所以我們可以在這個回調知道自己是不是進入了分屏模式。
  當App進入分屏模式後,將會觸發Activity的 onConfigurationChanged() ,這與以前我們在處理App從 橫豎屏切換 時的方法一樣,不同於的地方是這裏是寬/高都有所改變,而 橫豎屏切換 是寬高互換。我們最好處理好運行時狀態的改變,否則我們的App將被重新創建,即重新以新的寬高尺寸 onCreate() 一遍。
  如果用戶重新調整窗口的大小,系統在必要的時候也會觸發 onConfigurationChanged()。如果App的尺寸處於被拖動中還沒有完全繪制完成時,系統將暫時用主題中的 windowBackground 屬性來填充這些區域。
三 設置APP的分屏模式
  如果你適配到了 Android N,android:resizeableActivity 的默認值就是 true ,是默認支持分屏的。該屬性是在 AndroidManifest.xml 中的 <application> 或者 <activity> 標簽下設置新的屬性 android:resizeableActivity="true" 。設置了這個屬性後,你的App/Activity就可以進入分屏模式或者自由模式 了。如果這個屬性被設為false,那麽你的App將無法進入分屏模式,如果你在打開這個App時,長按右下角的小方塊,App將仍然處於全屏模式,系統會彈出Toast提示你無法進入分屏模式。
  註意:假如你 沒有適配到Android N ( target < Android N ),打包App時的 compileSDKVersion < Android N ,你的App也是可以支持分屏的!!!!原因在於:如果你的App 沒有 設置 僅允許Activity豎屏/橫屏 ,即沒有設置類型 android:screenOrientation="XXX" 屬性時,運行Android N系統的設備還是 可以 將你的App 分屏!! 但是這時候系統是不保證運行時的穩定性的,在進入分屏模式時,系統首先也會彈出Toast來提示你說明這個風險。
四 Layout attributes
  在Android N中,我們可以向 manifest 文件中添加 layout 節點,並設置一些新增加的屬性,通過這些屬性來設置分屏模式的一些行為,如最小尺寸等。
?android:defaultWidth
?android:defaultHeight
?android:gravity
?android:minimalSize
  我們可以給一個 Activity 增加一個 layout 子節點:

      <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
             >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER"
/> </intent-filter> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" /> </activity>

五 支持拖拽
  現在我們可以實現在兩個分屏模式的Activity之間拖動內容了。Android N Preview SDK中,View已經增加支持Activity之間拖動的API。具體的類和方法,可以參考N Preview SDK Reference,主要用到下面幾個新的接口:
?View.startDragAndDrop():View.startDrag() 的替代方法,需要傳遞View.DRAG_FLAG_GLOBAL來實現跨Activity拖拽。如果需要將URI權限傳遞給接收方Activity,還可以根據需要設置View.DRAG_FLAG_GLOBAL_URI_READ或者View.DRAG_FLAG_GLOBAL_URI_WRITE。
?View.cancelDragAndDrop():由拖拽的發起方調用,取消當前進行中的拖拽。
?View.updateDragShadow():由拖拽的發起方調用,可以給當前進行的拖拽設置陰影。
?android.view.DropPermissions:接收方App所得到的權限列表。
?Activity.requestDropPermissions():傳遞URI權限時,需要調用這個方法。傳遞的內容存儲在DragEvent中的ClipData裏。返回值為前面的android.view.DropPermissions。
五 測試清單
關於功能、性能方面測試,還可以按照下面的操作來進行。
?讓App進入,再退出分屏模式,確保此時App功能正常。
?讓App進入分屏模式,激活屏幕上的另外一個App,讓自己的App進入可見、paused狀態。舉了例子來講,如果你的App是一個視頻播放器,那麽當用戶點擊了屏幕上另外一個App時,你的App不應該停止播放視頻,即使此時你的Activity/Fragment已經接到了onPaused()回調。
?讓App進入分屏模式,拖動分欄上的小白線,改變App的尺寸。請在豎屏(兩個App一上一下布局)和橫屏(兩個App一左一右布局)模式下分別進行改變尺寸的操作。確保App不會崩潰,各項功能正常,且UI的刷新沒有花費太多時間。
?在短時間內、多次、迅速地改變App尺寸,確保App沒有崩潰,且沒有發生內存泄露。關於內存使用方面的更詳細註意事項,請參考Investigating Your RAM Usage。
?在不同的窗口設置的情況下,正常使用App,確保App功能正常,文字仍然可讀,其他的UI元素也沒有變得太小,用戶仍然可以舒適地操作App。

ANDROID N 分屏設置