繼該系列的第一篇和番外篇之後,今天我們來聊一聊多視窗開發的註意事項。實際上,與其說“多視窗開發”,不如說讓我們的APP 適應多視窗模式 。 可能有朋友會問,為什麼要提到多視窗模式呢? 這是因為: 1. 摺疊屏在展開後的屏幕會變大,而變大帶來的變化就是多視窗運行; 2. 多視窗模式在很早之前就已經被G ...
繼該系列的第一篇和番外篇之後,今天我們來聊一聊多視窗開發的註意事項。實際上,與其說“多視窗開發”,不如說讓我們的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()方法被回調了。還記得我們之前提過的改變視窗大小嗎?這就是一個實際的例子。該如何處理,大家心中應該有數了吧。
今天的分享就到這裡,希望上面的內容能夠對你有幫助。