博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.4Activity保存现场状态
阅读量:5124 次
发布时间:2019-06-13

本文共 5631 字,大约阅读时间需要 18 分钟。

概念:

保存Activity的状态是非常重要的,例如我们在玩一个游戏的时候,突然来了一个电话,这个时候在接听完电话之后我们返回到游戏中,这个时候我们希望游戏还是之前那个进度,或者说发生突发事件,游戏这个应用程序被关闭了,这个时候我们如果再重新打开游戏的话,我们如果还是希望回到之前的进度,我们就需要将其状态保存起来,这样在Activity的摧毁时,我们还能够根据保存的状态回到之前的进度。这就是Activity的状态保存。

 

生命图:

 

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 

但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前,所以我们在onSaveInstanceState() 方法中只能用来保存我们的Activity的临时的状态信息,而对于要持久化保存的对象或状态,我们应该在 onPause() 方法中来做

 

界面:

 

代码:

import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {    private static final String TAG = "logmain";    private Button button;    private EditText name;    private CheckBox soccer;    private CheckBox basketball;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        name = (EditText) this.findViewById(R.id.editText);        soccer = (CheckBox) this.findViewById(R.id.cbsoccer);        basketball = (CheckBox) this.findViewById(R.id.cbbasketball);        button = (Button) this.findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent i = new Intent(MainActivity.this, NextActivity.class);                startActivity(i);            }        });        //通过onCreate取值        if (savedInstanceState != null) {            String s = savedInstanceState.getString("name");            boolean cbsoccer = savedInstanceState.getBoolean("soccer");            boolean cbbasketball = savedInstanceState.getBoolean("basketball");           //测试1            /* name.setText("oncreatename");            soccer.setChecked(true);            basketball.setChecked(false);*/            //赋值1            name.setText(s);            soccer.setChecked(cbsoccer);            basketball.setChecked(cbbasketball);        }        Log.i(TAG, "---Main onCreate---");    }    @Override    protected void onStart() {        super.onStart();        Log.i(TAG, "---Main onStart---");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        //调用activity的onRestoreInstanceState得到保存的值        //如果赋值1注释了 测试1开放  再把 super.onRestoreInstanceState(savedInstanceState)和通过onRestoreInstanceState取值注释        //旋转屏幕就是测试1的值        super.onRestoreInstanceState(savedInstanceState);        //通过onRestoreInstanceState取值        /*if (savedInstanceState != null) {            String s = savedInstanceState.getString("name");            boolean cbsoccer = savedInstanceState.getBoolean("soccer");            boolean cbbasketball = savedInstanceState.getBoolean("basketball");            //测试2            //name.setText("onrestorename");            //soccer.setChecked(false);            //basketball.setChecked(true);            //赋值2            name.setText(s);            soccer.setChecked(cbsoccer);            basketball.setChecked(cbbasketball);        }*/        Log.i(TAG, "---Main onRestoreInstanceState---");    }    @Override    protected void onResume() {        super.onResume();        Log.i(TAG, "---Main onResume---");    }    @Override    protected void onPause() {        super.onPause();        Log.i(TAG, "---Main onPause---");    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        //通过onSaveInstanceState存值        outState.putString("name", name.getText().toString().trim());        outState.putBoolean("soccer", soccer.isChecked());        outState.putBoolean("basketball", basketball.isChecked());        Log.i(TAG, "---Main onSaveInstanceState---");    }    @Override    protected void onStop() {        super.onStop();        Log.i(TAG, "---Main onStop---");    }    @Override    protected void onRestart() {        super.onRestart();        Log.i(TAG, "---Main onRestart---");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.i(TAG, "---Main onDestroy---");    }}

 

布局:

 

测试:注意顺序

06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onPause---

06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onSaveInstanceState---(存值)
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onStop---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onDestroy---
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onCreate---(取值方法1)
06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onStart---
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onRestoreInstanceState---(取值方法2)
06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onResume---

转载于:https://www.cnblogs.com/manusas/p/5519644.html

你可能感兴趣的文章
java读写注册表的两种方式,Preferences与jRegistry
查看>>
轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单 demo
查看>>
[C++程序设计]用指向数组的指针作函数参数
查看>>
深入理解C# 静态类与非静态类、静态成员的区别 [转载]
查看>>
套接字结构汇总
查看>>
JS脚本病毒调试脚本-Trojan[Downloader]:JS/Nemucod
查看>>
谈谈两种标准库类型---string和vector
查看>>
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
查看>>
支付宝app支付java后台流程、原理分析(含nei wang chuan tou)
查看>>
Codeforces 480.E Parking Lot
查看>>
构造函数demo
查看>>
Python web开发——自定义userprofile(用户描述)
查看>>
ibatis的简介与初步搭建应用
查看>>
什么是单工、半双工和双工通信?有哪些实际应用的例子
查看>>
SQL Server-聚焦APPLY运算符(二十七)
查看>>
常用开发环境搭建配置教程(OneStall)
查看>>
SystemVerilog例子---traffic light
查看>>
常见的软件
查看>>
Despooler failed to execute the instruction, error code = 8
查看>>
【转载】linux进程及进程控制
查看>>