前言
Android在进行横竖屏切换、修改系统语言等操作后,Activty会被自动销毁并重建。这样可以便于应用重新获取mipmap、string等系统资源,从而实现设置修改。
如何避免Activity被自动销毁
如果不想让系统重新创建Activity,可以给Activity指定configChanges
属性,并且在Activity中重写onConfigurationChanged
方法进行一些自定义操作。例如,横竖屏、语言变化时不想重启Activity,可这样写:
<activity
android:name=".Main2Activity"
android:configChanges="locale|orientation|layoutDirection" />
configChanges属性
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
注意事项
在过滤横竖屏切换设置时,Android 4.0之前,设置orientation
即可,Android 4.0之后,除了设置orientation
之外,你还必须设置ScreenSize
。
<!--4.0以下-->
android:configChanges="orientation"
<!--4.0以上-->
android:configChanges="orientation|screenSize"
如何在Activity被销毁时进行数据缓存
当某些业务场景必须要Activity重建时,需要对于页面当前数据、部分控件状态进行缓存,这样可以避免部分bug、优化用户体验。
Activity重建时,系统会在销毁前调用onSaveInstanceState
方法(调用时序在onStop之前),在重建时调用onRestoreInstanceState
方法恢复缓存数据。我们可以重写onRestoreInstanceState
方法恢复数据,也可以在onCreate中使用savedInstanceState来恢复数据(需要对savedInstanceState判空)。
实例如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.d(TAG, "onCreate: ");
//恢复数据位置1(需要对savedInstanceState判空)
if (null != savedInstanceState) {
String string = savedInstanceState.getString("cache");
Log.d(TAG, "onCreate: " + string);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//恢复数据位置2(官方推荐)
String string = savedInstanceState.getString("cache");
Log.d(TAG, "onRestoreInstanceState: " + string);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("cache", "Cicada");
}