Activity详解(生命周期;启动模式;任务栈;状态保存)

来源:互联网 发布:104cm肛塞淘宝 编辑:程序博客网 时间:2024/04/26 00:15

Activity的生命周期

Activity的生命周期流程

在正常情况下,一个 Activity 的生命周期流程可以由下图表示
Activity生命周期图
1. onCreate: Activity正在被创建,可以理解为一个Activity的入口。在这个方法中,我们通常会通过调用 setContentView (int res) 或者 setContentView(Viewview) 来设置显示的视图,之后调用findviewById来初始化一些视图成员。
2. onStart: Activity正在被启动,处于这个生命周期的 Activity 还处于后台,是一个可见不可交互的状态,(你可以尝试在这个生命周期中sleep几秒,看看你能看到什么)。
3. onResume: Activity被置于前台,是一个可见可交互的状态。在这个方法被回调的时候,一个Activity可以被用户所正常操作
4. onPause: Activity 正在被停止,一般情况下接下来就回调onStop函数,注意的是这个方法中不应该执行耗时操作,如果是启动另外一个Activity,只有这个回调方法被调用了,被启动的 Activity 才能正常的被显示在前台。
5. onStop: Activity 即将停止,这个方法调用完后,并不一定会马上调用 onDestory,在这个Activity长时间没有被使用(回到这个Activity)或者是用户主动销毁才会调用 onDestory。
6. onDestory: Activity 正在被销毁,这是一个Activity生命周期的最后一个回调函数,在这个方法中,我们一般做一些最终的回收工作。注意的是onDestory被调用并不意味着这个Activity实例被销毁了(Java对象层面上)。
7. onRestart: Activity 没有被 Destory,处于不可见的状态,用户要重新回到这个 Activity 时,直接调用 onRestart 方法,重新启动Activity。

一些特殊情况

(1)如果打开一个新 Activity,这个新的Activity使用的是透明主题,那么旧Activity的onStop方法不会被调用
(2) 非standard启动模式的 Activity,Activity被复用时会调用onNewIntent()

Activity的 启动模式与任务栈

Android提供了4种启动模式

  分别是 standard、singleTop、singleTask、singleInstance。
在描述以上4个启动模式时,先来理清楚任务栈,TaskAffinity描述了一个Activity所需要的任务栈,TaskAffinity 是一个 String 类型的变量,一个 Activity 默认的 TaskAffinity 是应用的包名,当然也可以在 AndroidManifest 自定义Activity所需要的任务栈,不过必须也是包名的形式。

  1. standard: 标准模式,系统的默认模式,在一个任务栈中可以由多个该Activity的实例,即startActivity()方法会多次创建 Activity 的实例。在这种模式下,谁启动了这个 Activity,这个 Activity 就在谁的任务栈中,比如A 启动了 standard 模式的任务栈B,那么B就在A的任务栈中

  2. singletop: 栈顶复用模式,在一个任务栈中,如果栈顶已经存在了这个Activity,那么不会创建新的Activity,而且旧的Activity也不会重新调用生命周期函数。

  3. singleTask: 栈内复用模式,和栈顶模式不同的是,只要在一个栈中存在,就会复用,如果不是在栈顶,是在栈顶一下,就会讲它以上的 Activity 弹出栈,使其位于栈顶显示。这里需要注意一个 Activity 所需的任务栈的概念,比如S1栈中为AB,这时候如果启动一个 singleTask 模式的 Activity C,且所需的任务栈为 S2 ,这时候回先创建任务栈,再创建C并放入S2中

  4. singleInstance: 单实例模式,启动这种任务栈模式的Activity时,会创建一个新的任务栈,这时这个任务栈中只能有这个Activity,也有栈内复用的特性。可以看做是加强的singleTask。

在不是标准模式的启动模式的Activity,复用 Activity会调用 Activity 的 onNewIntent()方法。

Activity的状态保存

如何实现状态保存

  Android 系统考虑到Activity在异常情况下被杀死重建(资源相关的系统配置发生改变或者是由于内存不足优先级低的Activity被杀死),为了能很好的重建被杀死之前的操作视图,提供了 onSaveInstanceState(Bundle) 和 onRestoreInstance(Bundle) 2个回调方法,我们可以在 onSaveInstanceState(Bundle) 方法中给方法提供的参数 onSaveInstanceState(Bundle) 方法中给方法提供的 Bundle 参数赋值。当Activity重建时就可以在 onSavaInstanceState(Bundle) 中获得保存的值,进行操作。注意的是,系统已经默认为我们操作了一些数据视图的保存和重建,比如 EditText 的文本,光标的位置等等。这是因为每个View其实都有自己的重建回复功能,每个 View 都有 onSaveInstanceState() 和 onRestoreInstanceState(Parcelable) 方法, Activiy 在保存和重建时,会调用所有 contentView 子View 的响应保存重建状态的方法。

onSaveInstanceState(Bundle)方法的调用时机

  onSaveInstanceState(Bundle)是在可能被杀死的情况下就会被调用,如果这个方法被调用肯定是在onStop之前调用,不过和onPause没有时序关系,既可能在之前也可能在之后。

onCreate(Bundle)onRestoreInstanceState(Bundle)的区别

  这两个方法都能获得 BundlesavedInstanceState ,不同的是 onRestoreInstanceState(Bundle) 方法只有在 Bundle 不为空的时候才会被回调,所以在这里面可以不用判断空值的情况,一定是有值的,onStart(Bundle) 方法则需要判空。

1 0
原创粉丝点击