在切换屏幕方向的时候,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的锅。