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

繼該系列的第一篇和番外篇以後,今天咱們來聊一聊多窗口開發的注意事項。實際上,與其說「多窗口開發」,不如說讓咱們的APP適應多窗口模式
可能有朋友會問,爲何要提到多窗口模式呢?
這是由於:android

  1. 摺疊屏在展開後的屏幕會變大,而變大帶來的變化就是多窗口運行;
  2. 多窗口模式在很早以前就已經被Google官方支持,提供了相應的API,如今也到了該瞭解一下的時候了;
  3. 避免咱們辛辛苦苦開發好的APP,翻車在多窗口的溝裏;
  4. 雖然在Android Q中,多窗口模式極可能將成爲默認行爲,但要兼容以前的版本,咱們仍然須要作一些事情。

首先咱們來看一下若是咱們什麼都不作,切換多窗口時,會發生什麼呢?仍然從生命週期的角度來解讀:app

失去焦點(未作兼容處理)ide

D/MainActivity: onPause測試

從新得到焦點(未作兼容處理)code

D/MainActivity: onResumexml

注意,在默認狀況下,一旦失去焦點,會回調onPause()方法。而此時Activity仍然能夠被用戶看到,所以,若是咱們在onPause()裏面作了一些不合適的操做,好比來了一個手勢解鎖,或者特殊狀況下直接關閉程序,就明顯不合適了。
爲了不這種狀況出現,咱們但願在失去焦點的時候不回調onPause()。那麼,咱們只需在AndroidManifest.xml的application節點下添加以下代碼,便可規避該問題:生命週期

<meta-data
  android:name="android.allow_multiple_resumed_activities"
  android:value="true"/>

再次測試時,咱們發現onPause()已經不會被回調了。
到這裏,咱們有這樣一個疑問:咱們失去onPause()做爲獲得/失去焦點的斷定依據,咱們用什麼來得知狀態呢?
很簡單——藉助onWindowFocusChanged()回調,便可及時獲取焦點狀態了。使用以下代碼片進行測試:ip

@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
……it

至此,問題解決。
然而,你可能還會問:若是小窗口的尺寸發生變化如何處理?
這並不困難,經過調整APP窗口大小,再次觀察Logcat輸出,發現onConfigurationChanged()方法被回調了。還記得咱們以前提過的改變窗口大小嗎?這就是一個實際的例子。該如何處理,你們心中應該有數了吧。 今天的分享就到這裏,但願上面的內容可以對你有幫助。

相關文章
相關標籤/搜索