您的位置:首页 > 移动开发 > Android开发

Android Activity的生命周期

2016-12-13 16:38 363 查看

1. Android Activity的生命周期

在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调函数。Activity生命周期的每一个阶段就像金字塔中的台阶。当系统创建了一个新的activity实例,每一个回调函数会向上一阶移动activity状态。处在金字塔顶端意味着当前activity处在前台并处于用户可与其进行交互的状态。



Figure1 activity的生命周期

如何实现一个符合用户期待的app,我们需要注意下面几点:

* 使用app的时候,不会因为有来电通话或者切换到其他app而导致程序crash。

* 用户没有激活某个组件时不会消耗宝贵的系统资源。

* 离开app并且一段时间后返回,不会丢失用户的使用进度。

* 设备发生屏幕旋转时不会crash或者丢失用户的使用进度。

在Activity的几个状态中,只有三个状态是静态的,这三个状态下activity可以存在一段比较长的时间。(其它几个状态会很快就切换掉,停留的时间比较短暂):

Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为”running” 状态)

Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。

Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。

其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。

Note:

1. 除非程序在onCreate()方法里面就调用了finish()方法,系统通常是在执行了onPause()与onStop() 之后再调用onDestroy() 。在某些情况下,例如我们的activity只是做了一个临时的逻辑跳转的功能,它只是用来决定跳转到哪一个activity,这样的话,需要在onCreate里面调用finish方法,这样系统会直接调用onDestory,跳过生命周期中的其他方法。

2. 无论什么原因导致activity停止,系统总是会在onStop()之前调用onPause()方法。尽管onPause()方法是在onStop()之前调用,我们应该使用onStop()来执行那些CPU intensive的shut-down操作,例如往数据库写信息。

3. 一旦activity停止了,系统会在需要内存空间时摧毁它的实例(和栈结构有关,通常back操作会导致前一个activity被销毁)。极端情况下,系统会直接杀死我们的app进程,并不执行activity的onDestroy()回调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏。(这点需要注意)

4. 即使系统会在activity stop时停止这个activity,它仍然会保存View对象的状态(比如EditText中的文字) 到一个Bundle中,并且在用户返回这个activity时恢复它们。

5. 应该使用onStart()作为onStop()所对应方法。因为系统会在创建activity与从停止状态重启activity时都会调用onStart()。也就是说,我们在onStop里面做了哪些清除的操作,就该在onStart()面重新把那些清除掉的资源重新创建出来。

2. Activity的重建

对于正常销毁Activity,例如按下back键或者调用finish(),该Activity的实例在系统中会被销毁,下次再启动时需要重建该Activity。单还存在另外一种情况,就是如果 Activity 当前被停止或长期未使用,或者前台 Activity 需要更多资源以致系统必须关闭后台进程恢复内存,系统也可能会销毁 Activity。例如,用户按下了home键和跳转到下一个Activity。本来默认情况下,系统会使用 Bundle 实例状态保存您的 Activity 布局(比如,输入到 EditText 对象中的文本值)中有关每个 View 对象的信息。 这样,如果您的 Activity 实例被销毁并重新创建,布局状态便恢复为其先前的状态,且您无需代码。 但是,您的 Activity 可能具有您要恢复的更多状态信息,比如跟踪用户在 Activity 中进度的成员变量(为了 Android 系统恢复 Activity 中视图的状态,每个视图必须具有 android:id 属性提供的唯一 ID)。这时onSaveInstanceState()就会被调用(一般在onPause之前onStop之后),如果我们要保存有关 Activity 状态的其他数据,我们就得重写 onSaveInstanceState() ,当用户要离开 Activity 并在 Activity 意外销毁时向其传递将保存的 Bundle 对象时,系统会调用此方法。 如果系统必须稍后重新创建 Activity 实例,它会将相同的 Bundle 对象同时传递给 onRestoreInstanceState() 和 onCreate() 方法。



Figure2 activity的savestate

当系统开始停止您的 Activity 时,它会调用 onSaveInstanceState()(1),因此,您可以指定您希望在 Activity 实例必须重新创建时保存的额外状态数据。如果 Activity 被销毁且必须重新创建相同的实例,系统将在 (1) 中定义的状态数据同时传递给 onCreate() 方法 (2) 和 onRestoreInstanceState() 方法 (3)。

**_Note:_**onSaveInstanceState()和onRestoreInstanceState()“不一定”是成对的被调用的。onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android activity