当屏幕旋转时,这个Configuration就发生了改动,因而当时显现的Activity需求被重建,Activity目标会被停止,它的onPause()、onStop()和onDestroy()办法顺次触发,然后一个新的Activity目标被创立,onCreate()办法被触发。假定屏幕旋转前,用户正在手机上填写一个注册表单,假设处理不妥,用户会发现旋转后的表单变成空白的了,严重影响运用体会。
要处理这个问题有三种办法:
办法1:制止旋转屏幕
毫无疑问,这是最懒的办法了,相当于回避了本文提出的问题,办法如下看看就好:
android:screenOrientation=portrait
android:label=@string/app_name>
办法2:旋转后康复现场
已然Activity会被毁掉,那么咱们就能够运用前文介绍过的“耐久化/康复现场”办法来处理。即在onPause()里将用户当时现已输入的内容保存到数据库或Preference,在onCreate()办法里读取并填充到表单中,这也是官方引荐的办法。
需求弥补一点,假设Activity重建需求消耗很多资源或需求拜访网络导致时刻很长,能够完成onRetainNonConfigurationInstance()办法将所需数据先保存到一个目标里,像下面这样:
@Overridepublic Object onRetainNonConfigurationInstance() { final MyDataObject data = collectMyLoadedData(); return data;
}
重建时,在onCreate()办法里经过getLastNonConfigurationInstance()办法取得之前保存的数据,如下所示:
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main); final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); if (data == null) {//表明不是因为Configuration改动触发的onCreate()
data = loadMyData();
}
…
}
办法3:手艺处理旋转
一般情况下Configuration的改动会导致Activity被毁掉重建,但也有办法让指定的Configuration改动时不重建Activity,办法是在AndroidManifest.xml里经过android:configChanges特点指定需求疏忽的Configuration姓名,例如下面这样:
android:configChanges=orientation|keyboardHidden
android:label=@string/app_name>
这样设置今后,当屏幕旋转时Activity目标不会被毁掉——作为代替,Activity的onConfigurationChanged()办法被触发,在这里开发者能够获取到当时的屏幕方向以便做必要的更新。已然这种情况下的Activity不会被毁掉,旋转后Activity里正显现的信息(例如文本框中的文字)也就不会丢掉了。
假设你的运用里,横屏和竖屏运用同一个layout资源文件,onConfigurationChanged()里乃至能够什么都不做。但假设横屏与竖屏运用不同的layout资源文件,例如横屏用res/layout-land/main.xml,竖屏用res/layout-port/main.xml,则必须在onConfigurationChanged()里从头调用setContentView()办法以便新的layout能够收效,这时尽管Activity目标没有毁掉,但界面上的各种控件都被毁掉重建了,你需求写额定的代码来康复界面信息。
@Overridepublic void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, 横屏形式, Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, 竖屏形式, Toast.LENGTH_SHORT).show();
}
}
官方的Android开发文档不主张运用这种办法处理Configuration改动:
Note: Using this attribute should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.
最佳实践
考虑到旋转屏幕并不是使Activity被毁掉重建的仅有要素,依然引荐前文介绍过的办法:在onPause()里耐久化Activity状况,在onCreate()里康复现场,能够做到一举多得;尽管Google不引荐设置android:configChanges特点的办法,但假设你的Activity横向纵向共用同一个layout文件,办法3无疑是最省劲的。