Activity组件的生命周期
一.Activiy组件的三个状态:
1.前台状态(active) : 在屏幕的最上层,页面获得焦点,可以响应用户的操作
2.可视状态(paused) : 不能与用户交互,但是还存在于可视区域内,它依然存在内存中,保存着所持有的数据
3.后台状态(stoped) : 已经不在可视区域内,完全被其他Actiivy覆盖,它依然存在内存中,保存着所持有的数据
当Activity处于可视状态(paused)和后台状态(stoped)时,当系统内存不足时候,会被系统销毁其内存,其中保留的数据全部释放清空,只保留一个基本记录在
导航栈中,当再次回到此Activity时,系统会重新从onCreate事件重新运行一遍,以便创建(或者回复)必要的数据
二.Activity7个回调事件
onCreate
onStart
onRestart
onResume
onPause
onStop
onDestroy
三.3个生命周期循环
完整生命周期:onCreate -> onDestroy
可视生命周期:onStart -> onStop
前台生命周期:onResume -> onPause
四.基于生命周期的数据管理
当系统内存不足时,处于【可回收状态】(可视状态和后台状态)下的Activity会被系统回收,其中的数据全部清空,所以基于Activity的生命周期
管理数据,保证数据安全是非常重要的
当系统主动回收Activity所占的内存时,不会照常回调Activity的生命周期事件。
即onStop,onDestroy事件不会被执行
所以为了保证数据安全,需要在onPause时进行数据的保存
protected void onPause()
{
writeData(data);
}
五.基于生命周期的状态管理
每一个用户控件都有属于自己的状态,比如EditText的Text就是最典型的一个,妥善管理控件状态信息,能够提高用户体验
当程序以外中断(电话呼入),onSaveInstanceState事件会被触发,在此事件中可以保存Activity的一些状态信息,事件提供Bundle,以键值对的形式保存状态
这里的Bundle实例不会持久化保存,只是缓存,如果杀掉程序,则无法再被恢复
@Override
protected void onSaveInstanceState(Bundle outState)
{
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Log.d("test","onSaveInstanceState");
}
与之对应的是
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
Log.d("test", "onRestoreInstanceState");
}
需要注意的是这个两个事件何时回被触发.
onSaveInstanceState事件触发时机:
当activity非用户意愿(比如电话呼入而非Back或finish)被置为可视状态(pause)时候,将会在onPause事件之后调用onSaveInstanceState事件
onRestoreInstanceState事件触发时机:
非用户意愿使得Activity变为可视状态或者后台状态后,又让Activity回到前台状态,是不会触发onRestoreInstanceState事件的,只有
当前Activity真正被系统销毁了,才会发出onRestoreInstanceState事件
将会在onCreate之后触发onRestoreInstanceState事件
六.如何判断一个Activity是新创建的还是被系统回收后再次创建?
1.检测onCreate事件的savedInstanceState字段是否为空
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null) // 被系统回收,再次创建
{
status = savedInstanceState.getInt(statusStr);
Log.d("test", "status:" + status);
}
else // 首次创建
{ }
}
2.判断onRestoreInstanceState事件是否被触发
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
// 此activity被系统回收,再次创建
}
七.页面跳转与外部事件对Activity生命周期的影响
导航到新Activity ,按下Home按钮 ,关闭手机屏幕,都会依次触发: onPause -> onSaveInstanceState -> onStop
当按下Back按钮回退时候,主动执行finish()时候,会依次触发: onPause -> onSaveInstanceState -> onStop -> onDestroy
Activity组件的生命周期的更多相关文章
- Android中各组件的生命周期
1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...
- Jetpack 架构组件 Lifecycle 生命周期 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【老孟Flutter】Stateful 组件的生命周期
老孟导读:关于生命周期的文章共有2篇,第一篇是介绍 Flutter 中Stateful 组件的生命周期. 博客地址:http://laomengit.com/blog/20201227/Statefu ...
- ReactJS入门(二)—— 组件的生命周期
如果你熟悉avalon,使用过 data-include-rendered 和 data-include-loaded 等回调方法,那么你会很好地理解React组件的各个生命周期. 说白了其实就是Re ...
- React Native 中组件的生命周期
概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...
- 《微信小程序七日谈》- 第三天:玩转Page组件的生命周期
<微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩 前两篇 ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- reactjs入门到实战(七)---- React的组件的生命周期
React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他 getInitia ...
- Activity完整的生命周期
首语:群里看到一位网友说:你能说出Activity的完整生命周期吗?看到这句话,我也在反思自己,我也是个fresh,所以想找个时间仔细的扒一扒Activity生命周期. 首先拿一张简单而又复杂的生命周 ...
随机推荐
- AOP 面向方面的编程 Aspect Oriented Programing --第一次听说呢,汗!
http://wayfarer.cnblogs.com/articles/241024.html 抄在这里,方便复习! AOP技术基础 1.引言2.AOP技术基础 3.Java平台AOP技术研究4 ...
- PowerManager.WakeLock
PowerManager.WakeLock PowerManager.WakerLock是我分析Standup Timer源代码时发现的一个小知识点,Standup Timer 用WakeLock保证 ...
- jquery ajax调用返回json格式数据处理
Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async: ...
- Cubieboard4卡片式电脑
Cubieboard4 also named CC-A80, is a open source mini PC or single board computer which has ultra-pow ...
- Offer_1
#include <iostream> #include <cstring> using namespace std; class CMyString { public: CM ...
- VMware Player 使用错误集锦
1.执行VMware Player 弹出"开机时出错:内部错误"的提示.虚拟机执行不了,例如以下图: 解决的方法: 以管理员身份执行. 可能如今登录windows的 ...
- 关于如何实现程序一天只启动一次的想法(C++实现)
问题描述: 我们在程序开发当中,经常会遇到某些子程序需要实现一天只启动一次的功能,该功能实现的方法有很多种,其原理都是通过记录标记为来实现的.本次要分享的也是利用程序标记为来实现的,而且只需要使用一个 ...
- CEGUI 输入法窗口实现
游戏中经常要输入汉字,但当我们游戏没有自己实现输入法窗口时,windows会使用用户安装的输入法,但这个输入法窗口只会显示在游戏窗口外头,而且当我们游戏全屏时(真全屏,不是那种窗口式的假全屏),屏幕上 ...
- 博弈问题之SG函数博弈小结
SG函数: 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Ga ...
- HDU 3397 Sequence operation(线段树)
HDU 3397 Sequence operation 题目链接 题意:给定一个01序列,有5种操作 0 a b [a.b]区间置为0 1 a b [a,b]区间置为1 2 a b [a,b]区间0变 ...