不瞞大家,我在湖北的這 2 個月,體驗了 Android 的這個功能,真香!
一、序
大家好,我是承香墨影。不瞞大家說,我已經在湖北待了 2 個多月了。
前期一直處于封禁狀態,隨著疫情的好轉,現在已經可以出去吃碗熱干面了。
在家遠程辦公的這段時間,除了正常的工作學習之外,精神娛樂也少不了,肉身和空間上的限制,也無法阻礙對精神世界的追求。但無論怎么玩出了花樣,多數時候還是脫離不了手機這個小小的屏幕。
最近我深度體驗了 Android 中的一個功能,一個以前讓我嗤之以鼻,覺得沒有任何大用的功能,最近深度體驗之后,發現真香。
這個功能就是 Android 的分屏功能。在家的這段時間,發現大概只有手機的屏幕,才是自己能夠獨享的。
雖然 App 之間的切換,已經可以做到非常的順暢,但是如果你在刷劇的時候還要切到微信回復消息,之后再切回來,這樣的體驗無疑是非常差的。還別說有時候我無法忍受劇情的拖沓,總想著看著劇的同時再干點什么,例如刷個淘寶京東什么的。
這種需求,分屏模式就可以滿足。
上圖中就是我比較常用的 2 個場景,刷劇和游戲之余,還想干點別的,例如聊天、購物等等。
那我們今天就來聊聊 Android 的多窗口模式,以及使用它需要注意的一些點。另外有些 App 禁用了多窗口模式,但是依然有辦法強制多窗口,我們一起來聊聊。
二、Android 的分屏模式
2.1 什么是多窗口模式
Android 從 N(7.0,API Level 24) 開始支持多窗口模式,或者叫分屏模式,即允許在屏幕上同時打開多個 App,同時顯示多個窗口。
近幾年的新手機,應該都是緊跟最新的系統,7.0 的發布也有好幾年了,我想大家應該都可以享受到。
其實分屏模式使用起來很簡單,在最近打開任務窗口(Overview Screen)中,可以長按 App,選擇進入分屏模式。
2.2 分屏的生命周期
分屏模式支持同時打開 2 個 App 或者打開某個 App 的 2 個頁面,當然這需要特殊的技巧,后面會說到。
說回到生命周期,當切換分屏模式時,如果不做任何處理,Activity 會觸發銷毀再重建,這個過程相信大家應該比較熟悉,畢竟切換個屏幕方向,Activity 默認都會銷毀重建。
如果想禁用 Activity 銷毀重建,則配置 android:configChanges 屬性即可。
android:configChanges="screenLayout|screenSize|smallestScreenSize|orientation"
分屏模式還增加了一個系統回調 onMultiWindowModeChanged(isInMultiWindowMode) 方法,可以通過它的參數 isInMultiWindowMode 參數判斷多屏模式的進入和退出。
除此之外,如果想要主動判斷當前是否處于分屏模式,可以通過 Activity 或 Fragment 的 inMultiWindow() 進行判斷。
2.3 打開分屏的頁面
默認情況下,同一個 App 的多個 Activity 會共用同一個窗口,且無法分配到不同的窗口中。
所以我們在分屏模式下,打開某個頁面,實際上還是在當前窗口中打開,如果想讓新頁面被分配到不同的窗口中,可以通過給 Intent 設置 FLAG_ACTIVITY_LAUNCH_ADJACENT 標識來實現。
當處于分屏模式下時,通過該 Flag,新 Activity 就會在新的棧中被啟動,以此實現 2 個 Activity 被放置在不同的窗口中。
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
實際效果如下:
需要注意的是,該 Flag 隨著 Android N 的支持,所以在使用時需要判斷是否大于等于 Api Level 24。
另外我們也無需額外的判斷是否處于分屏狀態,如果當前不處于分屏狀態,則該 Flag 的設置無效。
2.4 支持分屏
前面提到,分屏模式由 Android 7.0 引入。那么如果 targetSdkVersion 被設置為 N 及以上時,分屏是默認開啟的,反之則是默認關閉。
分屏模式由 Application 的 android:resizeableActivity 屬性控制,true 為開啟,false 為關閉。我們可以通過這個屬性,主動管理分屏模式。
這就把是否支持分屏模式的權限,交到了開發者手中,但是我作為一個使用者,我在分屏模式下,打開某個 App 時提示我不支持,其實是一個非常不好的體驗。
例如今日頭條,本身是不支持分屏模式的,當我們嘗試以分屏模式打開它的時候,會以全屏模式打開 App,并且彈出一個 Toast 提示。
????
這種體驗肯定是非常差勁的,那么我們有什么辦法讓 App 強制支持分屏模式呢?
這就需要借助「開發者模式」了,通過「開發者模式」下的 2 個開關,來強制讓所有 App 都支持分屏模式,并且可以調整窗口大小。
需要注意的是,調整這 2 個開關,是需要重啟后才會生效。同時這種強制的行為本身也是開發者預料之外的,所以如果出現一些小問題也是符合預期的。
當我們把 2 個開關打開后,所有的 App 都能夠支持分屏模式,并且可以調整窗口大小。
????
三、小結時刻
分屏這個功能就說到這里,其實對于開發者來說,多數時候我們并不需要特殊設置什么,當 targetSdkVersion 為 24 的時候,其實已經默認支持。當然如果我們想要針對分屏模式做一些功能,也有對應的 Api 支持。
最后簡單小結一下:
1. 分屏模式在 Android N 開始是默認打開的,通常不需要做什么也可以適配;
2. 可以通過 onMultiWindowModeChanged() 監聽多窗口模式的切換,也可以通過 inMultiWindow() 主動判斷當前是否是多窗口模式;
3. 如果不想支持分屏模式,可以通過 android:resizeableActivity 來控制;
4. 如果想要強制全部 App 支持分屏模式,可以在「開發者模式」中設置,讓所有 App 都強制支持分屏模式;
【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】