在切換屏幕方向的時候,Activity默認會走銷毀->重建的生命周期,而有時候我們不希望如此,就需要做些額外的設置了:
1、在AndroidMainifest.xml中對應的Activity標簽中加入android:configChanges="keyboardHidden|orientation|screenSize"屬性,例:
1 <activity 2 android:name=".view.TestActivity" 3 android:configChanges="keyboardHidden|orientation|screenSize" />
這里是指定當keyboardHidden、orientation、screenSize這三種狀態發生改變時,由我們的程序進行處理,而不是走系統的銷毀->重建操作;另外,screenSize是在Api13+要求加上的;
2、重寫Activity的onConfigurationChanged方法,例:
1 @Override 2 public void onConfigurationChanged(Configuration newConfig) { 3 super.onConfigurationChanged(newConfig); 4 // 當前為橫屏 5 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 6 7 } 8 // 當前為豎屏 9 else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 10 11 } 12 }
在此方法中,我們可以根據前面設置的keyboardHidden、orientation、screenSize這三種狀態,判斷並執行想要的操作,當然什么都不做也可以;
就這兩步,問題已經解決了,每次切換屏幕方向將不會對Activity的生命周期造成影響,只會走onConfigurationChanged方法。但是!!!我碰到了個很神奇的東西:
Activity1跳轉到了Activity2,並且Activity2已經做了如上處理,當旋轉屏幕時,Activity2的確按照預想的執行,但是Log中怎么出現了Activity1的銷毀->重建,這提莫就想不通了,經過一番地毯式查找,終於發現原因在Activity2的Theme屬性中設置了<item name="android:windowIsTranslucent">true</item>,透明的Activity2導致了Activity1的重繪,所以去掉就好了,不知道這是不是windowIsTranslucent的一個bug,記得在其他地方好像也碰到過類似的后台Activity被重繪的問題,也是windowIsTranslucent的鍋。