一、场景说明
首先,需要从Activity的生命周期说起:
1.当启动了一个Activity,显示到界面上时:执行
onCreate()
onStart()
onResume()
2.旋转屏幕
onpause()
onstop()
ondestory()
onCreate()
onStart()
onResume()
可以看到过程是先销毁当前活动,再重新创建。
引发的问题:
第一次创建的数据没有得到保存,如下图
二、解决方案分为:
**一、java代码解决方案
1.现场保护
在Activity中重写:protected void onSaveInstanceState(Bundle outState){
outState.putXXX(Key,Value);
}
XXX:待保存数据的数据类型
key:与保存数据对应的键
Value:待保存的数据
2.现场恢复方法一
1)在onCreate(final Bundle savedInstanceState)方法中,
if(savedInstanceState != null){
value = savedInstanceState.get(Key);
}
当第一次启动Activity时,可能没有要恢复的数据,这时候
savedInstanceState == null
所以,需要加上判断
3.现场恢复方法二、
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
value = savedInstanceState.getXXX(Key);
}
上面现场恢复的方法都可以,一般我们使用第二种恢复方法。
二、XML修改解决方案
1)修改清单文件Androidmainfest.xml文件中
Activity标签的属性值:
**
三、实例演示:
解决方案一、修改java代码
代码:
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv_show;
private int num = 100;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn1);
tv_show = (TextView) findViewById(R.id.tv_show );
tv_show.setText(num + "");
//加血
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num += 50;
tv_show.setText(num + "");
}
});
}
}
1.使用 onCreate() + onSaveInstanceState() 修改代码如下
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv_show;
private int num = 100;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn1);
tv_show = (TextView) findViewById(R.id.tv_show );
if (savedInstanceState != null){
num = savedInstanceState.getInt("num");
tv_show.setText(num + "");
}
tv_show.setText(num + "");
//加血
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num += 50;
tv_show.setText(num + "");
}
});
}
保护现场方法一、
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("num",num);
}
}
2、使用 onSaveInstanceState(Bundle outState) + onRestoreInstanceState(Bundle savedInstanceState)
package com.yztc.day0703_wangnaipan_01;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv_show;
private int num = 100;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn1);
tv_show = (TextView) findViewById(R.id.tv_show );
// if (savedInstanceState != null){
//
// num = savedInstanceState.getInt("num");
// tv_show.setText(num + "");
// }
tv_show.setText(num + "");
//加血
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num += 50;
tv_show.setText(num + "");
}
});
}
保护现场方法一、
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("num",num);
}
//恢复现场、不需要再做 != null的操作
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
num = savedInstanceState.getInt("num");
}
}
解决方案二
实例演示:修改清单Androidmainfest.xml
java代码:
package com.yztc.day0703_wangnaipan_01;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv_show;
private int num = 100;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn1);
tv_show = (TextView) findViewById(R.id.tv_show );
tv_show.setText(num + "");
//加血
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num += 50;
tv_show.setText(num + "");
}
});
}
}
第一种方法:
即在 当前 Activity 的标签中增加以下属性(使得旋转屏幕时不会执行Activity的生命周期方法):
android:configChanges="orientation|keyboardHidden|screenSize">
需要注意的是:
sdk4.0之后orientation|keyboardHidden|screenSize,
sdk4.0之前orientation|keyboardHidden
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yztc.day0703_wangnaipan_01">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
**android:configChanges="orientation|keyboardHidden|screenSize">**
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
第二种方法:设置 横屏 或 竖屏
android:screenOrientation="landscape"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yztc.day0703_wangnaipan_01">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>