Handling runtime changes(二)自己处理Configuration change
转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/24287423
如果在configuration变化的时候你不需要更新resource,比如横竖屏切换的时候不需要更新UI,并且你需要避免重建Activity造型性能上得问题,你可以申明你的Activity自己来处理这些Configuration的变化。切记,自己来处理resource的更新将会很复杂,因为系统不会自动的帮你进行处理。所以不建议你自己来处理Configuration的change。
要声明自己处理这些变化,你需要在Activity中声明android:configChanges属性。在onConfigurationChanged
被调用的同时,Resource对象也基于新的configration被更新了,所以你可以不用重启Activity来重新设置。
注意从3.2开始,屏幕横竖屏的切换也会导致screenSize的变化,所以在configChanges中也需要加入screenSize,比如:android:configChanges="orientation|screenSize"
现在我们要自己来处理语言的变化。所以在Activity的声明中加入,这里我们加入layoutDirection的原因是,如果在API17以上,语言的变化也同时影响着layoutDirection配置信息的变化,所以这两个都需要加入到configChanges中。
<activity
android:name="com.example.androidtest.MainActivity"
android:configChanges="layoutDirection|locale"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
在Activity中加入,这里其实需要加入你对local变化的处理,比如重新设置文字等,如果不重新设置,因为你的Activity没有重新创建,所以还是会保持之前的语言文字:
@Override
publicvoid onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("==========","newConfig.locale : " + newConfig.locale);
}
测试
运行程序,程序中显示中文,按home,切换到系统设置页面,将语言改成英语,回到我们的应用程序。
查看log:
==========启动程序
04-21 22:13:46.629: D/==========(6141):MainActivity onCreate
04-21 22:13:46.649: D/==========(6141):MainActivity onCreate finish
04-21 22:13:46.649: D/==========(6141):MainActivity onStart
04-21 22:13:46.649: D/==========(6141):MainActivity onStart finish
04-21 22:13:46.649: D/==========(6141):MainActivity onResume
04-21 22:13:46.649: D/==========(6141):MainActivity onResume finish
==========按Home
04-21 22:13:48.499: D/==========(6141):MainActivity onPause
04-21 22:13:48.509: D/==========(6141):MainActivity onPause finish
04-21 22:13:48.579: D/==========(6141):MainActivity onSaveInstanceState
04-21 22:13:48.579: D/==========(6141):MainActivity onSaveInstanceState finish
04-21 22:13:48.579: D/==========(6141):MainActivity onStop
04-21 22:13:48.579: D/==========(6141):MainActivity onStop finish
==========切换到系统设置界面,改变语言到英语,切换回我们的应用程序,Activity不会被重新调用,而只会调用onConfigurationChanged
04-21 22:14:00.049: D/==========(6141):newConfig.locale : en_US
04-21 22:14:00.049: D/==========(6141):MainActivity onStart
04-21 22:14:00.049: D/==========(6141):MainActivity onStart finish
04-21 22:14:00.049: D/==========(6141):MainActivity onResume
04-21 22:14:00.049: D/==========(6141):MainActivity onResume finish
如果不给Activity设置configChanges的属性,那么在这些configuration变化的时候,不会调用onConfigurationChanged函数,会销毁之前的Activity并且重新启动一个Activity。
因为有很多configuration的变化都可能导致重启应用,并且你也需要考虑用户离开应用程序界面后,应用程序被销毁,回来的时候也需要重回到之前的状态,所以你的应用程序应该总是可以被重新启动的,除非特殊情况,不应该使用这种方式来阻止Activity重启,