Activity的生命周期注意事项

一、生命周期执行顺序

二、暂停

        当打开一个半透明的activity时(例如以对话框的形式),之前的activity会被暂停,只要这个activity仍然被部分可见,之前的activity则一直处于Paused状态。然而,一旦之前的activity被完全阻塞并不可见,它则会进入Stop状态.
通常应该在onPause()回调方法里面做下面的事情:
        1、停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
        2、提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(例如邮件草稿).
        3、释放系统资源,例如broadcast receivers, Camera,sensors (比如GPS), 或者是其他任何会影响到电量的资源。
        4、但是你不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储(File或者DB)上;如果必须做一些繁重的工作,可以在onStop里做

三、停止

1、Activity类提供了onStop()与onRestart()方法来允许在activity停止与重启时进行调用。
2、系统会在activity stop的时候销毁这个activity,它仍然会保存View对象的状态(比如EditText中的文字) 到一个Bundle中,并且在用户返回这个activity时恢复他们。
3、在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法, 因此你需要使用onStop()来释放资源,从而避免内存泄漏。
4、因为我们会在onStop方法里面做释放资源的操作,那么onDestory方法则是你最后去清除那些可能导致内存泄漏的地方。

四、恢复

        每次恢复activity时,系统会调用onResume()方法;所以,应该实现onResume()来初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)

五、onSaveInstanceState方法

1、Activity类提供了onStop()与onRestart()方法来允许在activity停止与重启时进行调用。
2、系统会在activity stop的时候销毁这个activity,它仍然会保存View对象的状态(比如EditText中的文字) 到一个Bundle中,并且在用户返回这个activity时恢复他们。
3、在极端情况下,系统会直接杀死你的app进程,并且不执行activity的onDestroy()回调方法, 因此你需要使用onStop()来释放资源,从而避免内存泄漏。
4、因为我们会在onStop方法里面做释放资源的操作,那么onDestory方法则是你最后去清除那些可能导致内存泄漏的地方。
5、当某个activity变得"容易"(即“未经你许可”时)被系统销毁时,该activity的onSaveInstanceState()就会被执行。 那些被系统用来恢复之前状态而保存的数据被叫做 “instance state” ,它是一些存放在Bundle对象中的key-value pairs。
  (1)、当用户按下HOME键时。
  (2)、长按HOME键,选择运行其他的程序时。
  (3)、按下电源按键(关闭屏幕显示)时。
  (4)、从activity A中启动一个新的activity时。
  (5)、屏幕方向切换时,例如从竖屏切换到横屏时。
  (6)、不包括主动的finish和按back按键
  onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据,持久化数据应该当用户离开当前的 activity时,在 onPause() 中保存(比如将数据保存到数据库或文件中)。说到这里,还要说一点的就是在onPause()中不适合用来保存比较费时的数据,所以这点要理解。
  如果想要系统资源发生改变以后不重新创建, 只需要配置android:configChanges=”orientation|screenSize”

六、启动模式

1、standard(默认的模式)
        这种Activity将被创建并置于栈顶,和发送intent的Activity处于同一个任务中。注:一般来讲,安卓第三个虚拟键所列出的那些就是任务。
如果我们切换到另外一个应用然后再切回到Gallery,你会发现standard launchMode启动的Activity仍然在Gallery任务的上面,导致在操作Gallery之前,我们必须首先结束这个额外的Activity。
撰写邮件的Activity或者发布社交网络状态的Activity都是采用这种Activity的例子。
2、singleTop模式。
        它的表现几乎和standard模式一模一样,一个singleTop Activity 的实例可以无限多,唯一的区别是如果在栈顶已经有一个相同类型的Activity实例,Intent不会再创建一个Activity
这种启动模式的用例之一就是搜索功能,如果每次显示搜索结果的时候我们都启动一个新的activity,10次搜索10个activity,那样当我们想返回最初的那个activity的时候需要按10次返回。
3、singleTask
        这种模式的Activity只允许在系统中有一个实例,需要android:taskAffinity=..."。如果系统中已经有了一个实例,singleTask Activity上面的所有Activity将以合适的方式自动销毁,让我们想要显示的Activity处于栈顶,如果没有,则会创建一个新的Activity并置放在合适的任务中。
邮件客户端的收件箱或者社交网络的时间轴。这些Activity一般不会设计成拥有多个实例,singleTask可以满足。
4、singleInstance
        这个模式非常接近于singleTask,具有全局唯一性,即整个系统中只会存在一个这样的实例,需要android:taskAffinity=""。区别在于持有这个Activity的任务中只能有一个Activity:即这个单例本身。
除非完全有必要,不然我不建议使用这种模式。

猜你喜欢

转载自blog.csdn.net/pangjl1982/article/details/83503050