activity的重建
Posted irving-zq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activity的重建相关的知识,希望对你有一定的参考价值。
activity的重建:
处于后台的activity可能由于系统内存资源不足或由于长时间处于stopped状态未被使用,也可能因activity的优先级较低而被系统销毁,系统会记录下activity的一些状态信息,通过bundle实例以键值对的集合存储一些数据记录,即“实例状态”,比如每个view中的EditText的输入的文本信息。
onPause()和onSaveInstanceState()不同的是:onPause()方法用于数据持久化的保存,而onSaveInstanceState()方法用于保存activity一些临时的状态。
为了保存更多需要恢复的状态信息,开发者需要重写onSaveInstanceState()回调方法,当activity被意外销毁时,系统会以bundle为参数回调IOnSaveInstanceState()方法。当系统需要重建该activity时,将这个bundle对象传给Oncreate()方法和onRestoreInstanceState()方法,将activity恢复到被销毁前的状态。
什么情况下onSaveInstanceState()会被调用呢?
(1)按下home键时
(2)长按home键,选择运行其他程序时
(3)关闭屏幕显示时
(4)从一个activity中启动一个新的activity时
(5)屏幕状态切换时
重写onSaveInstanceState()如:
public class DemoActivity extends Activity
private String userName;
.....
@Override
protected void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
outState.putString("name",userName);
将activity重建有两种途径:第一种是通过onCreate(bundle)重建。当新建一个activity或者是重建一个已有保存实例状态的activity时,onCreate()都会被调用,当onSaveInstanceSate()被调用后才会将保存了实例状态的bundle传给onCrate(),所以先判断bundle是否为空,再做状态恢复。
public class DemoActivity extends Activity
private String userName;
.....
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more_record);
if(savedInstanceState!=null)
userName=savedInstanceState.getString("name");
...
...
第二种是通过之后调用的onRestoreInstanceState()方法恢复状态。与onCreate()方法不同的是,onRestoreInstanceSate()方法在存在实例状态数据数据时(即onSaveInstanceState()在activity被销毁时调用过),onRestoreInstanceState()才会被调用,所以这里不用再判断bundle是否为空。
public class DemoActivity extends Activity
private String userName;
.....
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
super.onRestoreInstanceState(savedInstanceState);
userName=savedInstanceState.getString("name");
需要注意的是:总是调用super类的onSaveInstanceState()和onRestoreInstaceState()执行默认操作以确保将View架构的状态信息得到保存。
以上是关于activity的重建的主要内容,如果未能解决你的问题,请参考以下文章