Activity保存状态(三)
2017-04-25 18:03
155 查看
在Android开发过程中很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态。
1.页面没有必要设置横竖屏切换时
在清单文件中设置
<activity
android:name="com.example.eventbusdemo.SaveActivity"
android:screenOrientation="landscape"//强制此页面横屏显示
android:screenOrientation="portrait"//强制此页面数竖屏显示
>
</activity>
android:screenOrientation="portrait" :是限制此页面数竖屏显示
android:screenOrientation="landscape"是限制此页面横屏显示
有的页面没有必要可以横竖屏切换,所以这样设置不用切换屏幕也就不会有切换屏幕时activity重新执行onCreate()等生命周期方法
2.页面要进行横竖屏切换
在清单文件中设置(即没有设置android:screenOrientation)
<activity android:name="com.example.eventbusdemo.SaveActivity" >
</activity>
java代码
package com.example.eventbusdemo;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class SaveActivity extends Activity{
private String save="初始化";
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save);
textview=(TextView) findViewById(R.id.activity_savetextview);
if(savedInstanceState!=null){
save=savedInstanceState.getString("save");
}
textview.setText(save);
Log.d("SaveActivity", "onCreate方法!!!!!!!!!!");
}
@Override
protected void onStart() {
super.onStart();
Log.d("SaveActivity", "onStart方法!!!!!!!!!!");
}
@Override
protected void onResume() {
super.onResume();
Log.d("SaveActivity", "onResume方法!!!!!!!!!!");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("SaveActivity", "onRestart方法!!!!!!!!!!");
}
@Override
protected void onPause() {
super.onPause();
Log.d("SaveActivity", "onPause方法!!!!!!!!!!");
}
@Override
protected void onStop() {
super.onStop();
Log.d("SaveActivity", "onStop方法!!!!!!!!!!");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SaveActivity", "onDestroy方法!!!!!!!!!!");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(outState!=null){
outState.putString("save", "保存状态");
}
Log.d("SaveActivity", "onSaveInstanceState方法!!!!!!!!!!");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("SaveActivity", "onRestoreInstanceState方法!!!!!!!!!!");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("SaveActivity", "onConfigurationChanged方法!!!!!!!!!!");
}
}
切换时生命周期方法
刚刚进入页面
切换竖屏——>横屏时
横屏——>竖屏
由此可知当不在清单文件中设置android:screenOrientation时 切换屏幕时activity生命周期方法会重复执行,即切换时相当于退出重新进入。
并且此时onConfigurationChanged方法并没有执行(竖屏——>横屏,横屏——>竖屏都没有)
在清单文件中设置(设置了android:screenOrientation)
<activity
android:name="com.example.eventbusdemo.SaveActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor" >
</activity>
java代码和上面的一样再次就不在复制显示了
切换时生命周期方法
刚刚进入页面
切换竖屏——>横屏时
横屏——>竖屏
由此可知当在清单文件中设置android:screenOrientation时即
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor"
切换屏幕时activity生命周期方法不会会重复执行,
并且此时onConfigurationChanged方法执行(竖屏——>横屏,横屏——>竖屏都执行一次)
注意:
onConfigurationChanged未被调用。
根据正常认知,在AndroidManifest.xml中设置Android:configChanges="orientation“,
然后在Java代码中重写onConfigurationChanged,即不会重复Activity生命周期,而是调用onConfigurationChanged。
然而今天这种做法没有效果,什么原因呢。
原来,自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。
所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,
如果你想阻止程序在运行时重新加载Activity,除了设置”orientation“,你还必须设置"ScreenSize"。
解决方法:
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor"
附 android:screenOrientation
取值及含义 android:screenOrientation设定该活动的方向,该值可以是任何一个下面的字符串:
1.页面没有必要设置横竖屏切换时
在清单文件中设置
<activity
android:name="com.example.eventbusdemo.SaveActivity"
android:screenOrientation="landscape"//强制此页面横屏显示
android:screenOrientation="portrait"//强制此页面数竖屏显示
>
</activity>
android:screenOrientation="portrait" :是限制此页面数竖屏显示
android:screenOrientation="landscape"是限制此页面横屏显示
有的页面没有必要可以横竖屏切换,所以这样设置不用切换屏幕也就不会有切换屏幕时activity重新执行onCreate()等生命周期方法
2.页面要进行横竖屏切换
在清单文件中设置(即没有设置android:screenOrientation)
<activity android:name="com.example.eventbusdemo.SaveActivity" >
</activity>
java代码
package com.example.eventbusdemo;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class SaveActivity extends Activity{
private String save="初始化";
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save);
textview=(TextView) findViewById(R.id.activity_savetextview);
if(savedInstanceState!=null){
save=savedInstanceState.getString("save");
}
textview.setText(save);
Log.d("SaveActivity", "onCreate方法!!!!!!!!!!");
}
@Override
protected void onStart() {
super.onStart();
Log.d("SaveActivity", "onStart方法!!!!!!!!!!");
}
@Override
protected void onResume() {
super.onResume();
Log.d("SaveActivity", "onResume方法!!!!!!!!!!");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("SaveActivity", "onRestart方法!!!!!!!!!!");
}
@Override
protected void onPause() {
super.onPause();
Log.d("SaveActivity", "onPause方法!!!!!!!!!!");
}
@Override
protected void onStop() {
super.onStop();
Log.d("SaveActivity", "onStop方法!!!!!!!!!!");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SaveActivity", "onDestroy方法!!!!!!!!!!");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(outState!=null){
outState.putString("save", "保存状态");
}
Log.d("SaveActivity", "onSaveInstanceState方法!!!!!!!!!!");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("SaveActivity", "onRestoreInstanceState方法!!!!!!!!!!");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("SaveActivity", "onConfigurationChanged方法!!!!!!!!!!");
}
}
切换时生命周期方法
刚刚进入页面
切换竖屏——>横屏时
横屏——>竖屏
由此可知当不在清单文件中设置android:screenOrientation时 切换屏幕时activity生命周期方法会重复执行,即切换时相当于退出重新进入。
并且此时onConfigurationChanged方法并没有执行(竖屏——>横屏,横屏——>竖屏都没有)
在清单文件中设置(设置了android:screenOrientation)
<activity
android:name="com.example.eventbusdemo.SaveActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor" >
</activity>
java代码和上面的一样再次就不在复制显示了
切换时生命周期方法
刚刚进入页面
切换竖屏——>横屏时
横屏——>竖屏
由此可知当在清单文件中设置android:screenOrientation时即
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor"
切换屏幕时activity生命周期方法不会会重复执行,
并且此时onConfigurationChanged方法执行(竖屏——>横屏,横屏——>竖屏都执行一次)
注意:
onConfigurationChanged未被调用。
根据正常认知,在AndroidManifest.xml中设置Android:configChanges="orientation“,
然后在Java代码中重写onConfigurationChanged,即不会重复Activity生命周期,而是调用onConfigurationChanged。
然而今天这种做法没有效果,什么原因呢。
原来,自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。
所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,
如果你想阻止程序在运行时重新加载Activity,除了设置”orientation“,你还必须设置"ScreenSize"。
解决方法:
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor"
附 android:screenOrientation
取值及含义 android:screenOrientation设定该活动的方向,该值可以是任何一个下面的字符串:
1."unspecified" 默认值. 由系统选择显示方向. 在不同的设备可能会有所不同. 2."landscape" 横向 3."portrait" 纵向 4."user" 用户当前的首选方向 5."behind" 与在活动堆栈下的活动相同方向 6."sensor" 根据物理方向传感器确定方向. 取决於用户手持的方向, 当用户转动设备, 它跟随改变. 7."nosensor" 不经物理方向传感器确定方向. 该传感器被忽略, 所以当用户转动设备, 显示不会跟随改变. 除了这个区别,系统选择使用相同的政策取向对於“未指定”设置. 系统根据“未指定”("unspecified")设定选择相同显示方向.
相关文章推荐
- android 后台 activity 被系统回收 保存状态
- Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
- 保存和恢复activity的状态数据
- 关于转屏,与activity状态的保存onRetainNonConfigurationInstance()
- 保存/恢复Activity和Fragment状态的最佳实践(译)
- activity状态的保存与恢复机制,生命周期
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
- 保存和恢复activity的状态数据
- android activity详解三:保存activity的状态
- Android开发之保存和恢复Activity的状态与数据
- 关于转屏,与activity状态的保存onRetainNonConfigurationInstance()
- android -保存和恢复activity的状态数据
- Android 组件系列-----Activity保存状态
- activity状态保存讲解四
- Activity的状态保存
- [译]Android Activity 和 Fragment 状态保存与恢复的最佳实践
- Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
- Android实现activity状态保存
- Activity中使用注解进行状态保存
- Activity状态的保存