您的位置:首页 > 移动开发 > Android开发

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."unspecified"
默认值. 由系统选择显示方向. 在不同的设备可能会有所不同.

2."landscape"
横向

3."portrait"
纵向

4."user"
用户当前的首选方向
5."behind"
与在活动堆栈下的活动相同方向
6."sensor"
根据物理方向传感器确定方向. 取决於用户手持的方向, 当用户转动设备, 它跟随改变.
7."nosensor"
不经物理方向传感器确定方向. 该传感器被忽略, 所以当用户转动设备, 显示不会跟随改变. 除了这个区别,系统选择使用相同的政策取向对於“未指定”设置. 系统根据“未指定”("unspecified")设定选择相同显示方向.


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息