一、序
大家好,我是承香墨影。不瞞大家說,我已經在湖北待了 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 都強制支持分屏模式;
今天就到這裏,本文對你有幫助嘛?歡迎留言、轉發、點好看,一鍵三連!
熱文推薦:
公衆號後臺回覆成長『成長』,將會得到我準備的學習資料。