【安卓笔记】activity生命周期

类似文章网上数不胜数,这里我只是为了记录一下这个知识点,方便以后复习。

------------------------------------------------------------------------------------------------------------------------

下面梳理一下activity的生命周期。

一.activity生命周期图:
【安卓笔记】activity生命周期

【安卓笔记】activity生命周期

【安卓笔记】activity生命周期

二.activity生命周期概述
请参照图2(个人觉着这个描述比较形象而且容易理解):
在Activity的整个生命中,系统按顺序地调用一系列的像金字塔般的生命周期函数。也就是说,每个阶段的活动是金字塔中单独的一个步骤。当系统创建了一个新的Activity实例,每调用一个函数,就会往金字塔顶端走一步。而金字塔最顶端的状态(Resumed状态)就是Activity正在前台运行而且用户正与其交互的状态。
当用户开始离开Activity,系统就会调用其他的方法,使Activity的状态往金字塔的低端走,并逐步去除Activity。在某些条件下,Activity只会往低端走一小步并在该处等待(例如用户转去了其他应用程序),而在该处Activity也可以重新回到顶端(当用户返回到原Activity)并恢复到原来的状态。
生命周期函数解析

onCreate(Bundle savedInstanceState) :通常用于初始化设置

onStart() :当Activity可见未获得用户焦点不能交互时系统会调用

onRestart() : 当Activity已经停止然后重新被启动时系统会调用

onResume(): 当Activity可见且获得用户焦点能交互时系统会调用

onPause():  失去焦点时调用。应该使用onPause()来存储持久数据。

onStop():当Activity被新的Activity完全覆盖不可见时被系统调用

onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等


三.activity三种状态:

 Running(运行):在屏幕前台(位于当前任务堆栈的顶部)

 Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡)

 Stopped(停止):完全被另一个Activity覆盖

四.常见事件中activity生命周期函数调用顺序

参照了网上的文章,自己亲测正确,并补充了一些。

1.进入Activity

onCreate(创建)  -> onStart(用户可见)  ->  onResume(获取焦点)

2.BACK键

onPause(失去焦点) -> onStop(用户不可见) -> onDestroy(被销毁)

3.HOME键
Home键退出:onPause -> onStop
Home键回来:onRestart ->  onStart -> onResume 

4.休眠/恢复

休眠:onPause->onStop

恢复:onRestart->onStart->onResume

5.旋转屏幕

(1)未设置android:configChanges:

 onPause  ->  onStop  ->  onDestory  ->  onCreate  -> onStart  ->  onResume

(2)设置了android:configChanges="orientation|keyboardHidden":

  不会调用生命周期函数,注意早期版本应该这样配置:

android:configChanges="oriention|keyboardHidden|screenSize" 

注:activity中配置android:screenOrientation="portrait"和

android:screenOrientation="landscape"可以让界面保持横屏或竖屏。

6.来电

来电,显示来电界面:

 onPause  ->  onStop

关闭电话界面,重新回到当前Activity:

 onRestart ->  onStart -> onResume

7.其他Activity

进入下一个Activity:

 onPause  ->  onStop

从其他Activity返回至当前Acitivity:

 onRestart ->  onStart -> onResume

这里其实还得分情况,如果下一个activity中配置了这样的参数

android:theme="@android:style/Theme.Dialog"(即activity以dialog的形式显示)

则调用情况是这样的:

   进入另一个activity:onPause

           返回原activity:onresume

因为原来的activity只是失去焦点而已,并不是完全被覆盖。


五、与Activity生命周期结合的应用场景

 与广播(Broadcast)结合

   在onResume注册广播(registerLinstener),在onPause注销广播(unregisterLinstener)。 例如做"摇一摇"功能(传感器)、监听网络变化,就可以在onResume中注册监听,在onPause里注销掉,已节省资源提高效率。

 与服务(Service)结合

   在onStart绑定服务(bindService),在onStop中取消绑定(unbindService)。 例如:需要通过Service定时更新UI上的数据,而Activity的可见周期在onStart与onStop之间,那么就可以再onStart时启动服务,在onStop时停止服务。为了节约系统资源,除了提高用户体验以外,开发人员应尽可能的优化程序。

 释放资源

   可以在onDestory中释放一些资源。比如可以在onDestory时调用MediaPlayer的release。

-------------------------------------------------------------------------------------------
注意事项:

 1 所有Activity生命周期方法的实现都必须先调用其父类版本(如super.onCreate)。

 2 由于Activity经常会暂停和恢复之间切换,所以onResume和onPause这两个方法应当是轻量级的。

 3    在系统再某种紧急情况下需要回收内存,onStop、onDestory可能不会被调用,因此需要在onPause中把需要长期保存的数据保存起来。



【安卓笔记】activity生命周期

上一篇:android4.0屏蔽HOME键的方法


下一篇:C#调用Bartender打印绑定数据库,动态设置Sql