繼該系列的第一篇和番外篇以後,今天咱們來聊一聊多窗口開發的注意事項。實際上,與其說「多窗口開發」,不如說讓咱們的APP適應多窗口模式。
可能有朋友會問,爲何要提到多窗口模式呢?
這是由於:android
首先咱們來看一下若是咱們什麼都不作,切換多窗口時,會發生什麼呢?仍然從生命週期的角度來解讀: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()方法被回調了。還記得咱們以前提過的改變窗口大小嗎?這就是一個實際的例子。該如何處理,你們心中應該有數了吧。 今天的分享就到這裏,但願上面的內容可以對你有幫助。