按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号。系统也有可能销毁activity如果它是停止状态并且很久没有使用,或者前台的activity需要更多的资源时系统不得不关掉后台进程来获得内存。

当activity销毁了因为用户点击的返回按钮或者自己结束,系统认为这个activity永远的消失了因为这个activity实例不再需要了。但是,如果时因为系统原因销毁了activity(不是app正常的行为),这个时候虽然activity实例不存在了,但是系统会记住它存在过,也就是说当用户回到这个activity时,系统会用这个activity销毁时保存的状态信息创建一个新的实例。系统用来用来恢复以前状态的数据叫做"instance state",它是Bundle对象中一系列的键值对。

注意:activity在每次旋转屏幕时每次都会销毁和重建。当屏幕旋转方向时,屏幕的配置变了而且activity可能需要重新加载资源(比如布局)所以系统西药销毁然后重建前台的activity。

默认情况下,系统使用Bundle来保存activity每个view对象的信息(比如EditText对象中的文字)。所以,如果activity实例被销毁然后重建,不需要写代码就可以让布局恢复到以前的状态。但是,activity可能有更多你想要恢复的信息,比如activity中跟踪用户行为的成员变量。

注意:为了让Android系统能够恢复activity中view的状态,每个view都要有一个唯一的ID,就是android:id属性。

为了存储其他的activity状态,你可以重写onSaveInstanceState()方法。系统在离开activity时会调用这个方法然后传给Bundle对象,Bundle对象会在activity销毁时存储下来。如果后来系统需要重建activity,它会把一个同样的Bundle对象传递给onRestoreInstanceState()和onCreate()方法。

图2.当系统开始停止activity时,会调用onSaveInstanceState(),这样你可以自定义其他你想存储的数据在activity重建时使用。如果activity被销毁了然后又需要重建,系统会把刚才存储的数据传递给onCreate()和onRestoreInstanceState()方法。

保存Activity状态

当activity将要停止时,系统会调用onSaveInstanceState()来让activity把状态信息保存到键值对中。这个方法的默认实现保存了activity的view层次结构的信息,比如EditText中的文字,ListView的滑动位置。

为了保存activity的其他信息,你可以实现onSaveInstanceState()然后把信息以键值对的形式存到Bundle对象中,例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
... @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

注意:一定要调用父类的onSaveInstanceState()这样默认的实现才能保存view的层次结构信息

恢复Activity状态

当activity在销毁之后重建时,可以用系统传过来的Bundle来恢复你之前保存的状态。onCreate()onRestoreInstanceState()会收到同样的保函状态信息的Bundle。

因为onCreate()方法在新创建activity实例和重建的时候都会调用,所以在读Bundle之前要判断一下是否为空。如果是空,系统是在创建一个新的activity实例,如果不是,就是在重建之前销毁的。

例如,下面是如何在onCreate()中恢复状态:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first // 查看是不是在重建以前销毁的实例
if (savedInstanceState != null) {
// 恢复保存的成员变量
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
//这里可能是为新的实例初始化默认值
}
...
}

除了在onCreate()中恢复状态,也可以选择实现onRestoreInstanceState(),系统会在onStart()之后调用onRestoreInstanceState().系统只有在有保存的数据需要恢复时才调用onRestoreInstanceState(),所以不需要检查Bundle是否为空:

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState); // 从保存的实例中恢复状态信息
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

注意:一定要调用父类的onRestoreInstanceState()这样默认的实现才能恢复view的层次结构信息。

如果要学习更多关于重建activity的信息(比如runtime相关,屏幕旋转)可以查看handling Runtime Changes.

上一篇:Android-管理Activity生命周期 -停止和重启Activity

Android-管理Activity生命周期 -重新创建Activity的更多相关文章

  1. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

  2. Android学习路线(十二)Activity生命周期——启动一个Activity

    DEMO下载地址:http://download.csdn.net/detail/sweetvvck/7728735 不像其他的编程模式那样应用是通过main()函数启动的.Android系统通过调用 ...

  3. android --Activity生命周期具体解释

    一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...

  4. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  5. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  6. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

  7. android开发之生命周期

    android开发之生命周期 一:Activity的生命周期: 这几天了了解了安卓Activity的生命周期,对于生命周期有了大概的理解: 一个Activity的生命周期也就是Activity从生成到 ...

  8. Android-管理Activity生命周期 -停止和重启Activity

    停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...

  9. Android-管理Activity生命周期 -暂停和恢复一个Activity

    在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...

随机推荐

  1. hdu4612(双连通缩点+树的直径)

    传送门:Warm up 题意:询问如何加一条边,使得剩下的桥的数目最少,输出数目. 分析:tarjan缩点后,重新建图得到一棵树,树上所有边都为桥,那么找出树的直径两个端点连上,必定减少的桥数量最多, ...

  2. SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科

    SSH WebShell: SSH在线WEB管理器安装教程 - VPS管理百科 SSH WebShell: SSH在线WEB管理器安装教程 本站原创 [基于 署名-非商业使用-相同方式分享 2.5 协 ...

  3. APS.NET Cookie

    Cookie 提供了一种在 Web 应用程序中存储用户特定信息(如历史记录或用户首选项)的方法. Cookie 是一小段文本.伴随着请求和响应在 Web server和client之间来回传输.Coo ...

  4. 假设拦截WebView的错误和OS升级到4.4后链接不能点击的问题

    android OS升级到4.4之后,有些WebView的链接我们点击无效了,以下能够解决当中的某一种情况: webviewClient的shouldOverrideUrlLoading方法必须返回f ...

  5. NYOJ 12 喷水装置(二)

    pid=12">喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n( ...

  6. 新西兰gap year_百度百科

    新西兰gap year_百度百科 新西兰gap year    Working Holiday Visa,即打工度假签证.它允许旅行者出于补贴旅行费用的目的而在签证颁发国边打工边旅行.用来鼓励双方国家 ...

  7. LINUX设备驱动程序的注意事项(两)建设和执行模块

             <一>:设置測试系统 首先准备好一个内核源代码树,构造一个新内核,然后安装到自己的系统中.           <二>:HelloWorld模块 #inclu ...

  8. JAVA insert() 插入字符串 reverse() 颠倒 delete()和deleteCharAt() 删除字符 replace() 替换 substring() 截取子串

    insert() 插入字符串 StringBuffer insert(int index,String str) StringBuffer insert(int index,char ch) Stri ...

  9. MYSQL高可用(HA)随想

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  10. 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030 cp936是微软自己发布的用在文件系统中的编码方式.而bg2312是中国国家标准.我明白mount -t vfa ...