zoukankan      html  css  js  c++  java
  • Android学习总结——Activity状态保存和恢复

    Android中启动一个Activity如果点击Home键该Activity是不会被销毁的,但是当进行某些操作时某些数据就会丢失,如下:

    Java class:

    package com.king.activitytest2;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        private EditText editText;
        private Button buttonSet,buttonRead;
        //定义一个常量
        double pai;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //获取控件
            editText=(EditText)findViewById(R.id.edit1);
            buttonSet=(Button) findViewById(R.id.btn_Set);
            buttonRead=(Button) findViewById(R.id.btn_Read);
    
            //设置监听事件
            buttonSet.setOnClickListener(this);
            buttonRead.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btn_Set:
                    editText.setText("圆周率为:");
                    pai=3.141592654;
                    break;
                case R.id.btn_Read:
                    String str=editText.getText().toString()+pai;
                    Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    xml布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <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"
        tools:context="com.king.activitytest2.MainActivity">
    
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit1"/>
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置"
            android:id="@+id/btn_Set"
            android:layout_marginTop="46dp"
            android:layout_below="@+id/edit1"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="35dp"
            android:layout_marginStart="35dp" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="读取"
            android:id="@+id/btn_Read"
            android:layout_alignTop="@+id/btn_Set"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="46dp"
            android:layout_marginEnd="46dp"
            />
    
    </RelativeLayout>

    这里在程序中定义了一个double类型的变量,当我们点击读取按钮时会将该变量的值加在后面并显示,打开程序然后进行操作,一切正常:

    但是我们点击设置之后将屏幕横过来,咦,pai跑哪去了?

    其实这里当我们进行横竖屏切换时,迫于系统机制,该Activity已经被销毁了。但是为什么这个页面还存在呢,这是因为这个销毁并不是用户去主动退出,所以Android系统实现了这些状态的保存功能,但是一些数据达不到被保留的要求,并没有被保留,就像程序中可怜的pai就被抛弃了!

    那我们需要在像这种横竖屏切换过程中保留数据该如何做呢,这里我们就需要重写onSaveInstanceState()方法:

     @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //将需要保存的数据放入Bundle中
            outState.putDouble("pai",pai);
        }

    保存解决了,那我们如何取出呢?很简单,只需要在onCreate()方法中判断其参数是否为null,不为null便将其取出。

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //将pai保存
            if(savedInstanceState!=null)
                pai=savedInstanceState.getDouble("pai");
        }

    现在我们可以看到屏幕切换之后pai也没有被销毁。

     

    沉迷学习,日渐消瘦!


         更多技术干货,欢迎关注我的公众号:ChaoYoung

              

  • 相关阅读:
    汉诺塔问题_栈模拟递归
    汉诺塔问题_栈模拟递归
    Dockerfile指令
    Dockerfile指令
    C++全排列组合算法
    剑指offer——复杂链表复制
    数据库中的索引实现原理
    TCP三次握手四次挥手详解
    TCP协议原理
    OSI七层模型
  • 原文地址:https://www.cnblogs.com/xch-yang/p/5762722.html
Copyright © 2011-2022 走看看