Activity的生命周期
了解生命周期回调
当用户开始离开Activity时,系统会调用其他方法在金字塔中将Activity状态下移,从而销毁Activity。在有些情况下,Activity将只在金字塔中部分下移并等待(比如,当用户切换到其他应用时),Activity可从该点开始移回顶端(如果用户返回到该Activity),并在用户停止的位置继续。
正确实现您的Activity生命周期方法可确保您的应用按照以下几种方式良好运行,包括:
- 如果用户在使用您的应用时接听来电或切换到另一个应用,它不会崩溃。
- 在用户未主动使用它时不会消耗宝贵的系统资源。
- 如果用户离开您的应用并稍后返回,不会丢失用户的进度。
- 当屏幕在横向和纵向之间旋转时,不会崩溃或丢失用户的进度。
-
五种状态:
- Resumed:在这种状态下,Activity处于前台,且用户可以与其交互。(有时也称为“运行”状态。)
- Paused:在这种状态下,Activity被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity—部分阻挡。暂停的Activity不会接收用户输入并且无法执行任何代码。
- Stopped:在这种状态下,Activity被完全隐藏并且对用户不可见;它被视为处于后台。停止时,Activity实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。
- 其它状态 ( Created与 Started)都是短暂的瞬态。
创建一个新的实例
系统都会调用新activity实例中的onCreate()方法。一旦onCreate 操作完成,系统会迅速调用onStart() 与onResume()方法。使得activity停留在Resumed状态。
销毁Activity
activity的最后一个回调是onDestroy()。
大多数 app并不需要实现这个方法,因为局部类的references会随着activity的销毁而销毁。
然而,如果activity含有在onCreate调用时创建的后台线程,或者是其他有可能导致内存泄漏的资源,则应该在OnDestroy()时进行资源清理,杀死后台线程。
暂停Activity
当系统调用activity中的onPause(),从技术上讲,意味着activity仍然处于部分可见的状态.但更多时候意味着用户正在离开这个activity,并马上会进入Stopped state. 通常应该在onPause()回调方法里面做以下事情:
- 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
- 提交在用户离开时期待保存的内容(例如邮件草稿).
- 释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。
通常,不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储(File或者DB)上,因为它会导致切换到下一个activity变得缓慢(应该把那些heavy-load的工作放到onStop()去做)。
恢复activity
当用户从Paused状态恢复activity时,系统会调用onResume()方法。
系统每次调用这个方法时,activity都处于前台,包括第一次创建的时候。所以,应该实现onResume()来初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)
停止activity
当activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源。
极端情况下,系统会直接杀死我们的app进程,并不执行activity的onDestroy()回调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏。(这点需要注意)
启动与重启activity
当activity从Stopped状态回到前台时,它会调用onRestart().系统再调用onStart()方法,onStart()方法会在每次activity可见时都会被调用。
onRestart()方法则是只在activity从stopped状态恢复时才会被调用,因此我们可以使用它来执行一些特殊的恢复(restoration)工作。在onStop里面做了哪些清除的操作,就该在onStart里面重新把那些清除掉的资源重新创建出来。
重新创建Activity
当Activity是因为用户点击Back按钮或者是activity通过调用finish()结束自己时,系统就丢失了对Activity实例的引用。
系统会在用户回到这个Activity时有这个Activity存在过的记录,系统会使用那些保存的记录数据(描述了当Activity被Destory时的状态)来重新创建一个新的Activity实例。那些被系统用来恢复之前状态而保存的数据被叫做 “instance state” ,它是一些存放在Bundle对象中的key-value pairs。
Caution: 你的Activity会在每次旋转屏幕时被destroyed与recreated。
当屏幕改变方向时,系统会Destory与Recreate前台的activity,
因为屏幕配置被改变,你的Activity可能需要加载另一些替代的资源(例如layout).
当系统开始停止Activity时,只有在Activity实例会需要重新创建的情况下才会调用到onSaveInstanceState() (1) , 在这个方法里面可以指定额外的状态数据到Bunde中。
如果这个Activity被destroyed然后这个实例又需要被重新创建时,系统会传递在 (1) 中的状态数据到 onCreate() (2) 与 onRestoreInstanceState()(3).
Stop时保存Activity状态
当我们的activity开始Stop,系统会调用 onSaveInstanceState().
重新时恢复Activity状态
当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle