前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Activity 的临时数据储存

Activity 的临时数据储存

作者头像
指点
发布2019-01-18 17:32:54
1.1K0
发布2019-01-18 17:32:54
举报
文章被收录于专栏:指点的专栏指点的专栏

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

代码语言:javascript
复制
首先,我们了解到,当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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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临时数据的储存

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档