繼該系列的第一篇和番外篇之後,今天我們來聊一聊多視窗開發的注意事項。實際上,與其說“多視窗開發”,不如說讓我們的APP适應多視窗模式。
可能有朋友會問,為什麼要提到多視窗模式呢?
這是因為:
- 折疊屏在展開後的螢幕會變大,而變大帶來的變化就是多視窗運作;
- 多視窗模式在很早之前就已經被Google官方支援,提供了相應的API,現在也到了該了解一下的時候了;
- 避免我們辛辛苦苦開發好的APP,翻車在多視窗的溝裡;
- 雖然在Android Q中,多視窗模式很可能将成為預設行為,但要相容之前的版本,我們仍然需要做一些事情。
首先我們來看一下如果我們什麼都不做,切換多視窗時,會發生什麼呢?仍然從生命周期的角度來解讀:
失去焦點(未做相容處理)
D/MainActivity: onPause
重新獲得焦點(未做相容處理)
D/MainActivity: onResume
注意,在預設情況下,一旦失去焦點,會回調onPause()方法。而此時Activity仍然可以被使用者看到,是以,如果我們在onPause()裡面做了一些不合适的操作,比如來了一個手勢解鎖,或者特殊情況下直接關閉程式,就明顯不合适了。
為了避免這種情況出現,我們希望在失去焦點的時候不回調onPause()。那麼,我們隻需在AndroidManifest.xml的application節點下添加如下代碼,即可規避該問題:
<meta-data
android:name="android.allow_multiple_resumed_activities"
android:value="true"/>
再次測試時,我們發現onPause()已經不會被回調了。
到這裡,我們有這樣一個疑問:我們失去onPause()作為得到/失去焦點的判定依據,我們用什麼來得知狀态呢?
很簡單——借助onWindowFocusChanged()回調,即可及時擷取焦點狀态了。使用如下代碼片進行測試:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.d(TAG, "onWindowFocusChanged - " + hasFocus);
}
使APP反複得到/失去焦點,觀察Logcat輸出,得到如下結果:
D/MainActivity: onWindowFocusChanged - false
D/MainActivity: onWindowFocusChanged - true
D/MainActivity: onWindowFocusChanged - false
D/MainActivity: onWindowFocusChanged - true
……
至此,問題解決。
然而,你可能還會問:如果小視窗的尺寸發生變化如何處理?
這并不困難,通過調整APP視窗大小,再次觀察Logcat輸出,發現onConfigurationChanged()方法被回調了。還記得我們之前提過的改變視窗大小嗎?這就是一個實際的例子。該如何處理,大家心中應該有數了吧。
今天的分享就到這裡,希望上面的内容能夠對你有幫助。