关于Activity被kill时保存数据

目标效果:

  

这个例子是跳过两个页面显示,加入点击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的几率非常小,有的软件开发过程中会忽略这一种情况,但是作为了解还是有用的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activity被销毁,其中的数据将会丢失。为了避免这种情况,可以将数据保存Activity的生命周期方法中,例如onSaveInstanceState()。在这个方法中,可以保存Activity的状态信息,例如EditText中的文本,CheckBox的选中状态等等。系统将会在Activity被销毁调用这个方法,让你有机会保存数据。 具体的步骤如下: 1. 在Activity中重写onSaveInstanceState()方法。 2. 在onSaveInstanceState()方法中,使用Bundle对象保存需要保存数据。 3. 在Activity的onCreate()方法中,判断savedInstanceState是否为null。如果savedInstanceState不为null,说明Activity是被销毁后重新创建的,可以从savedInstanceState中获取保存数据。 以下是一个示例代码: ``` public class MainActivity extends Activity { private EditText mEditText; private CheckBox mCheckBox; private boolean mIsChecked; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.editText); mCheckBox = (CheckBox) findViewById(R.id.checkBox); if (savedInstanceState != null) { mEditText.setText(savedInstanceState.getString("text")); mIsChecked = savedInstanceState.getBoolean("isChecked"); mCheckBox.setChecked(mIsChecked); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("text", mEditText.getText().toString()); outState.putBoolean("isChecked", mCheckBox.isChecked()); } } ``` 在这个示例中,我们保存了EditText中的文本和CheckBox的选中状态,并在Activity重新创建恢复了它们的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值