目标效果:
这个例子是跳过两个页面显示,加入点击Button调到第二个页面,突然想修改第一个页面的输入内容,再返回,有可能刚才输入的内容被清空了。这是因为在Activity不可见的状态下,如果内存不足,可能Activity会被kill,这时候需要进行数据的保存来再次显示。
1.如图,在MainActivity.java外,新建SecondActivity.java和ThirdActivity.java,并搭建对应的xml文件。
2.activity_main.xml页面:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tvAlert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="92dp"
android:text="@string/hello_world" />
<EditText
android:id="@+id/etName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvAlert"
android:layout_centerHorizontal="true"
android:layout_marginTop="33dp"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/btClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/etName"
android:layout_centerHorizontal="true"
android:layout_marginTop="36dp"
android:text="下一步" />
</RelativeLayout>
3.MainActivity.java页面:
package com.example.savadata;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText etName; //全局变量
Button btClick;
String name;
@Override
protected void onCreate(Bundle savedInstanceState) { //参数为Bundle,用于页面意外关闭时保存值
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etName=(EditText) findViewById(R.id.etName);
btClick=(Button) findViewById(R.id.btClick);
if(savedInstanceState!=null){ //判断,若参数不为空,代表曾经在页面输入过内容却意外关闭了,这时候进入循环
String name=savedInstanceState.getString("name"); //获取参数中的Bundle值
etName.setText(name); //显示在EditText中
}
btClick.setOnClickListener(new OnClickListener() { //匿名内部类,用于Button的点击处理
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class); //当实例Intent与跳转写到一句时,第一个页面要写全,分为两个页面可以只写this
Bundle bundle=new Bundle();
name=etName.getText().toString(); //将EditText中输入的内容转换成String型
bundle.putString("name",name);
intent.putExtras(bundle); //跳转时携带Bundle
startActivity(intent); //开始跳转
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) { //每次打开页面都会调用此方法,当页面被意外关闭时,可以在该方法中保存值,并作为参数传递到onCreat方法中
super.onSaveInstanceState(outState);
outState.putString("name",name); //将点击事件中获得的EditText值保存
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
onSaveInstanceState()方法是在打包bundle的同时备份在方法中,当页面再次被创建时先调用该方法,如果有值则根据情况在onCreate()中进行处理显示,如果没有值则默认参数为空,不进行处理。
4.activity_second.xml只有一个Button控件,设置id为btClick。
5.SecondActivity.java页面:
package com.example.savadata;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondActivity extends Activity {
Button btClick;
Bundle bundle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
getData(); //获取前一个页面传来的Bundle
btClick=(Button) findViewById(R.id.btClick);
btClick.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
intent.putExtras(bundle); //获取之后直接传到下一个页面
startActivity(intent);
}
});
}
private void getData() {
bundle=getIntent().getExtras();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.second, menu);
return true;
}
}
注意intent携带bundle数据跳转到这个页面,并没有显示,所以在实例出一个bundle接收值后直接进行下一次跳转就好,不用将bundle的详细值获取出来。
6.activity_third.xml页面只有一个TextView控件,设置id为tvShow。
7.ThirdActivity.java页面:
package com.example.savadata;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class ThirdActivity extends Activity {
TextView tvShow;
String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
tvShow=(TextView) findViewById(R.id.tvShow);
getData(); //获取前一个页面传来的Bundle
getShow(); //在页面中显示TextView内容
}
private void getData() {
Bundle bundle=getIntent().getExtras();
name=bundle.getString("name");
}
private void getShow() {
tvShow.setText("你好"+name);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.third, menu);
return true;
}
}
获取bundle值并显示数据。
8.其实Activity被kill的几率非常小,有的软件开发过程中会忽略这一种情况,但是作为了解还是有用的。