专栏首页指点的专栏Activity 的临时数据储存

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 条评论
登录 后参与评论

相关文章

  • Activity的启动模式

    在Android程序中,应用程序通过活动栈来管理Activity,活动栈中有多少个Activity对象,我们在退出程序的时候就要按多少下返回键(即要将活动栈中的...

    指点
  • Android 全局广播的使用

    广播作为Android一个重要的组成部分,很多功能的实现都依赖于广播,Android系统在发生一些重要事情的时候都会发送广播(电量变化、网络变化等等)。我们也可...

    指点
  • Android中自定义Toast

    在Android程序中,Toast可谓用处多多,Toast本身作为消息提示,不占用焦点,用户可以处理其他程序的同时接收Toast中显示的信息。但是我们平常看见的...

    指点
  • 安卓运动圆环自定义View

    记得这个东西原来有个同事问过我,当时正在自学自定义View和属性动画这一块,对这个功能也没有写过,所以就google了一下,发了几个类似效果的github项目给...

    萬物並作吾以觀復
  • Arcgis for Android 开发环境搭建(Android Studio篇)

    开发工具:Android Studio 2.1.2(mac版本) 开发环境:OS X EI Capitan 版本 10.11.5 Android系统要求:A...

    专注APP开发
  • Manacher算法

     求最大回文子串的长度一般要看原串的长度是奇数还是偶数,然后分别求得,但Manacher算法的第一个神奇之处就是把两种字符串都化为长度为奇数,从而简化计算:

    mathor
  • Jmeter系列之常用组件(一)

    在上一篇:Jmeter系列之简介与环境安装,主要介绍Jmeter简介、环境安装及接口实战。一般在实际接口自动化过程中,会同时包含多个组件共同完成工作。

    ITester软件测试小栈
  • emacs配置文件3

    ;;普通设置 (setq inhibit-startup-message t);关闭起动时闪屏 (setq visible-bell t);关闭出错时的提示声...

    py3study
  • C++STL模板库适配器之stack容器

    Stl中的适配器,有栈 (stack) 队列 queue 根priority_queue 适配器都是包装了 vector list deque等顺序容器. 也...

    IBinary
  • 如何提高逻辑思维能力?

    这个逻辑推理,在我们生活中无处不在。如果你看过《神探狄仁杰》、《福尔摩斯》、《白夜追凶》,还有《唐人街探案》这些破案片。就会发现,这些破案高手都有一个的破案套路...

    猴子聊数据分析

扫码关注云+社区

领取腾讯云代金券