1.创建水平布局
当设备旋转时会改变设备配置。设备配置是一系列的特征组合,用来描述当前设备的状态。这些特征有:屏幕方向、屏幕像素密度、屏幕尺寸、键盘类型、底座模式以及语言等。
通常为了匹配不同的设备配置,应用会提供不同的备选资源。当应用在运行时发生配置变更,Android会销毁当前Activity,为新配置寻找最佳资源,然后创建新实例并且使用这些资源。
例:可创建水平模式布局,当设备旋转至水平方向,Android就会自动使用此布局。
创建水平布局2.JPG
创建水平布局3.JPG
需要注意的是,两个布局文件(水平和竖直方向)的文件名必须相同,这样它们才能以同一个资源ID被引用。
2.保存数据
利用onSaveInstanceState(Bundle outState),该方法通常在onStop()方法之前由系统调用。需要注意的一点:当用户手动点击后退键,系统不会调用onSaveInstanceState()方法,会彻底销毁当前的Activity。
当Activity被销毁的时候(非典型的生命周期),系统会调用onSaveInstanceState(Bundle outState)自动将Activity视图数据保存,并将保存数据的Bundle传给onCreate()和onRestoreInstanceState()方法。当Activity重建的时候,系统会调用onRestoreInstanceState()方法来恢复Activity的视图数据(通常在onStart()方法之后)。
在覆盖onCreate(Bundle)方法时,实际上是调用Activity超类的onCreate(Bundle)方法并传入收到的bundle。在超类代码实现里,取出保存的视图状态数据,进行一些初始化操作,使onRestoreInstanceState()方法更好地执行。
也可以通过覆盖onSaveInstanceState(Bundle)方法,将一些数据保存在Bundle中,然后在onCreate(Bundle)方法中取回这些数据。
Bundle是键--值对结构,存储字符串键与特定的类型值之间的映射关系。这个特定的类型可以是基本数据类型,也可以是实现了Seraializable或Parcelable接口的对象。
然而,在Bundle中保存定制类对象不是一个好主意,因为取回的对象可能已经没有用了。比较好的做法是,通过其他方式保存对象,而在Bundle中保存标识对象的基本类型数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
mIndex = savedInstanceState.get(KEY_INDEX);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_INDEX, mIndex);
}
在onSaveInstanceState()中保存小的或暂存状态的数据,可以在onStop()方法中进行稍微有些量级的操作,保存永久性数据(SharedPreferenced)。onPause()方法中不适合进行相对有量级的操作(最好不要有操作)。
3.设备旋转时的生命周期
onCreate(Bundle)-->onStart()-->onResume()-->onPause()-->onSaveInstanceState(Bundle)
-->onStop()-->onDestroy()
-->onCreate(Bundle)-->onStart()-->onRestoreInstanceState(Bundle)-->onResume()
网友评论