【基础篇】activity生命周期及数据保存
常见的Android 的界面,均采用Activity+view的形式显示的,一提到Activity,立即就能联想到Activity的生命周期与状态的保存。 下面先从Activity的生命周期开始说起
1.打开Activity:则onCreate()->onStart()->onResume()
2.关闭Activity:则onPause()->onStop()->onDestroy()
3.以上第一步打开Activity后如果按back键(即发生了退回的操作,这个时候应用程序是要关闭的,属于用户主动对Activity销毁)则onPause()->onStop()->onDestroy()
4.以上第一步打开Activity后如果按Home键(即访问手机系统的主菜单界面或者来电等其它原因中断了当前Activity。这个时候因为acvitity是处于不可见的状态,但是没有进行清理销毁的,只是暂停了),于是 onPause()->onStop()
5.以上第四步之后返回或再打开Activity,则onRestart()->onStart()->onResume()
6. 从一个Activity调用另一个Activity的话,则在目标Activity中的onCreate(Bundle savedInstanceState )就多了一个Bundle(就是一个intent,里面包含了该Activity的创建动作和信息),将Activity按照相应的情况创建出来->onStart()->onResume() 之后操作就是一直这样循环的,所有生命周期也就是这样循环的
通过上面的描述,大体上知道了Activity的生命周期
但是,后台Activity的优先级是比较低的,当系统内存等资源不足时,将会把后台的Activity killed 掉,此时界面中的信息将会对丢失,怎么办呢?
Android的设计者早都为我们想好了,怎样处理避免界面信息的丢失。
在Activity中存在两个非常重要的回调方法,onSaveInstanceState(Bundle outState) 和onRestoreInstanceState(Bundle savedInstanceState) 方法,那么是不是只要复写了该方法,就一定会调用呢? 答案是否定的。
下面下从onSaveInsatanceState(Bundle outState) 开始说起,当发生以下状态时,会出发onSaveInstanceState(Bundle outState)方法:
1、当用户按下HOME键时。
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从Activity A中启动一个新的Activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
源码示例:
public class ActivityLife extends Activity {
// 在Activity生命周期开始时被调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("***", "onCreate");
}
// 当activity从停止状态重新启动时调用
@Override
protected void onRestart() {
super.onRestart();
Log.d("***", "onRestart");
}
// 当activity对用户即将可见的时候调用。
@Override
protected void onStart() {
super.onStart();
Log.d("***", "onStart");
}
// onCreate完成后被调用,用来恢复UI状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("***", "onRestoreInstanceState");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("***", "onActivityResult");
}
// 开始与用户进行交互
@Override
protected void onResume() {
super.onResume();
Log.d("***", "onResume");
}
// Activity即将移出栈顶保留UI状态时调用此方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("***", "onSaveInstanceState");
}
// 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用
// CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
@Override
protected void onPause() {
super.onPause();
Log.d("***", "onPause");
}
// 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
@Override
protected void onStop() {
super.onStop();
Log.d("***", "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("***", "onDestroy");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("***", "onConfigurationChanged");
}
}
可视过程的生命周期onStart() 直到onPause(),可交互的生命周期 onResume() 至onPause()
保存activity状态
当系统因为某种原因关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。
保存activity状态有两种方式:
1、onSaveInstanceState
它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(),
所以它们两个都可以恢复捕获的状态。
那么,在什么时刻会执行onSaveInstanceState方法
1、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
说到onSaveInstanceState,那么必须来看看onRestoreInstanceState方法,onRestoreInstanceState只有在Activity确实被系统回收了才会被调用,比如横竖屏切换onRestoreInstanceState就会被执行,一般来说按Home键,再去回到Activity,Acitivity一般不被系统销毁,onRestoreInstanceState也不会被调用。
2、onPause
因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据,因为可能根本保存不了,
而是应该用onPause()来达到这个目的。
——转载自http://my.oschina.net/helu/blog/159024
【基础篇】activity生命周期及数据保存的更多相关文章
- Activity生命周期,状态保存恢复(经典)
一.整体框架 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- Activity生命周期与状态保存
弹出系统对话框,程序仍部分可见 onPause 对话框消失时 onResume 调用一个新的Activity,老的Activity不可见时 onPause->onStop 从新的Activi ...
- 基础总结篇之一:Activity生命周期[转]
from:http://blog.csdn.net/liuhe688/article/details/6733407 基础总结篇之一:Activity生命周期 子曰:溫故而知新,可以為師矣.< ...
- 基础总结篇之一:Activity生命周期
子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...
- 基础总结篇之中的一个:Activity生命周期
子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...
- 转:基础总结篇之一:Activity生命周期
熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实android中的Acti ...
- [转]基础总结篇之一:Activity生命周期
子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思 ...
- Android学习整理之Activity生命周期篇
一.Activity生命周期说明 Activity的四种状态: ⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能 ...
- 【转】Android总结篇系列:Activity生命周期
[转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...
随机推荐
- 一个 VUE 组件:实现子元素 scroll 父元素容器不跟随滚动(兼容PC、移动端)
介绍 我们经常遇到一种情况.当滑动滚动条区域时,子元素滚动条到底部或顶部时就会触发父级滚动条,父级滚动条同理会继续向上触发,直至body容器.这是浏览器默认的滚动行为. 但是很多情况,我们想要子元素滚 ...
- 洛谷 P2744 [USACO5.3]量取牛奶Milk Measuring
P2744 [USACO5.3]量取牛奶Milk Measuring 题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最 ...
- php持续集成环境笔记
记录下php集成环境中若干个工具的安装步骤和过程: 安装pear wget http://pear.php.net/go-pear.phar $ php go-pear.phar 使用:pear in ...
- [Webpack + React] Import CSS Modules with TypeScript and webpack
If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webp ...
- linux线程间同步(1)读写锁
读写锁比mutex有更高的适用性,能够多个线程同一时候占用读模式的读写锁.可是仅仅能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,全部试图对这个锁加锁的线程都会被堵塞 ...
- Windows API Hook
原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是由于看了原文.我才学会了HOOK.鉴于原文的排版不是非常好, ...
- sass08 if while for each
scss @function getzIndex($layer: default){ $zindexMap: (default: 1, modal: 1000, dropdown: 500, grid ...
- HBase框架基础(三)
* HBase框架基础(三) 本节我们继续讨论HBase的一些开发常识,以及HBase与其他框架协调使用的方式.在开始之前,为了框架之间更好的适配,以及复习之前HBase的配置操作,请使用cdh版本的 ...
- vuejs keep-alive
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Mac上vmware虚拟机Windows10安装JDK8及配置环境
1.jdk8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.双击下载的jdk进行安装 3.安装成功之 ...