天天看點

糧草先行——Android折疊屏開發技術點(二)

繼該系列的第一篇和番外篇之後,今天我們來聊一聊多視窗開發的注意事項。實際上,與其說“多視窗開發”,不如說讓我們的APP适應多視窗模式。

可能有朋友會問,為什麼要提到多視窗模式呢?

這是因為:

  1. 折疊屏在展開後的螢幕會變大,而變大帶來的變化就是多視窗運作;
  2. 多視窗模式在很早之前就已經被Google官方支援,提供了相應的API,現在也到了該了解一下的時候了;
  3. 避免我們辛辛苦苦開發好的APP,翻車在多視窗的溝裡;
  4. 雖然在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()方法被回調了。還記得我們之前提過的改變視窗大小嗎?這就是一個實際的例子。該如何處理,大家心中應該有數了吧。

今天的分享就到這裡,希望上面的内容能夠對你有幫助。