Activity 的临时数据储存

一个Android项目程序一定会存在多个 Activity ,在Activity对象的切换过程中,难免会有一些Activity对象被系统回收,那么,这个Activity中的数据也会消失,打个比方:一个Activity中存在一个EditText输入框,输入到一半的时候跳出另一个界面,而不巧的是这个存在EditText的界面刚好被系统回收了。那么再次启动这个Activity的时候EditText的数据又得重新输入,这是极大的影响用户的体验的。那么我们该如何解决这个问题呢。

首先,我们了解到,当Activity对象调用onDestroy() 方法被摧毁之前会调用Activity的onSaveInstanceState(Bundle b)方法,我们注意到这个方法是有一个Bundle类型的参数的,而在Activity的onCreate(Bundle savedInstanceState) 方法中也有一个Bundle 类型的参数。。。一些聪明的小伙伴或许已经明白了:在Activity创建的时候,onCreate(Bundle savedInstanceState)方法中的Bundle类型的参数就是传入的onSaveInstanceState(Bundle b) 方法中的参数。我们可以把它理解为当Activity要被摧毁时,onSaveInstanceState(Bundle b)方法被调用,将数据保存在Bundle对象中,并且储存在应用程序的某个角落(内存)中,当这个Activity被重新创建时,这个数据传入onCreate(Bundle savedInstanceSatte) 中。OK,明白了这些,让我们一起来试试这个方法的用法:

创建一个Android工程:
activity_main.xml:

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText 
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java:

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
    public static String dataSaveKey = "data_save_key";
    EditText editText = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i("MainActivity", "onCreate");
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
        if(savedInstanceState != null)
        {   editText.setText(savedInstanceState.getString(this.dataSaveKey));   // 启动时恢复数据
        }
    }

    @Override 
    // 当Activity 对象被摧毁之前系统会调用的方法
    protected void onSaveInstanceState(Bundle data)
    {
        super.onSaveInstanceState(data);
        String str = editText.getText().toString();
        data.putString(this.dataSaveKey, str);  // 将数据保存
    }

    @Override 
    public void onDestroy()
    {
        Log.i("MainActivity", "onDestroy");
        super.onDestroy();
    }
}

之后,启动程序,在文本编辑框中输入几个字符,然后按住Ctrl+F11 将模拟器方向转向,打开LogCat,可以看到相应的Activity状态信息这里写图片描述
MainActivity先被摧毁,然后被创建。
MainACtivity中的EditText开始时的状态为什么也没有:
这里写图片描述
在EditText中随便输入几个字符,并且将模拟器换了方向之后:
这里写图片描述
我们发现即使MainActivity经历了先被摧毁,然后被创建的过程,但是其中的EditText控件中的信息并没有丢失。
Ok,任务完成。通过一个Activity类中的方法实现了Activity临时数据的储存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值