fred-ye / summary

my blog
43 stars 9 forks source link

[Android]Activity生命周期的总结 #33

Open fred-ye opened 9 years ago

fred-ye commented 9 years ago

在Activity的整个生命周期中,Activity只有三种稳定状态: Resumed, Paused, Stopped. Resumed状态下,Activity是处于和用户交互状态。Paused状态下,Activity是部份遮盖,此时不会响应用户的行为。不会执行任何代码(不代表后台线程不执行). Stopped 状态,Activity对用户不可见,不会执行任何代码。

创建一个新的Activity

其生命周期回调方法的执行顺序是: onCreate—>onStart()—>onResume() 实际上 activity 在onStart()方法被调用后就已是对用户可见。只是在onResume()执行完后才能和用户交互。

Activity的销毁

系统通常是在执行了onPause() 和onStop() 之后再调用onDestory(),除非你的程序在onCreate()方法里面就调用了finish()方法。比如在Splash屏,我们会在onCreate()方法里面调用finish()方法,这样系统会直接就调用onDestory()方法,其它生命周期方法则都不会执行(onPause(), onStop()).

Activity的暂停

当activity被其它的组件挡住,如Dialog,导致其部分可见且不能和用户交互,此时activity将会进入paused状态。在onPause()方法中,我们应该进行资源的释放操作(停止动画)。当activity处于暂停状态时, Activity 实例是驻留在内存中的。 从paused状态恢复到可交互状态 会调用onResume()方法。

Activity 的停止和重启

(1)􏰅􏰆􏳿􏵹􏲂􏷕􏱋􏰅􏰄􏿬􏰃􏱡􏱵􏱶􏰿􏰒当用户打开最近使用app菜单并切换你的App到另一个App时,这个时候􏰏􏱯􏸸􏸹􏰄􏰗􏰠􏲹􏰅􏰆􏰘􏳘􏹔􏸒􏺍􏰇􏰈􏰄􏶋􏱽􏳙􏵅􏰍􏱃􏰣􏰤􏲂􏷕􏱋􏰅􏳙 􏵅􏰄􏰙你的App是被停止的,如果用户通过手机主界面的启动程序图标或者最近使用程序的窗口回到你的app,那么你的activity会重启。 (2) 由ActivityA 启动了Activity B, 此时Activity A会被Stop, 用户点击Back 按钮后,Activity A会被重启。 整个流程中Activity A生命周期方法调用如下: onStop() —> onRestart() —> onStart() —> onResume() 无论什么原因导致Activity()的停止,系统总是会在onStop()之前调用onPause()。 当Activity的onStop()方法调用了,Activity将不再可见,并且应该释放那些不再需要的所有资源,一旦一个Activity停止了,系统会在不再需要这个activity时摧毁它的实例。在极端情况下,系统会直接杀死app 进程,并且不执行activity的onDestory()方法,因此资源的释放应该放在onStop()方法中。 onStart() 方法:用户进入到这个activity之前需要一段时间,所以onStart()方法是一个比较好的地方来验证某些必须的系统特性是否可用。

Activity的重新创建

导致Activity被destroy的行为:(a)用户按Back键,(2)程序中执行了finish()方法来结束自己,(3) 系统在Activity处于stop状态又长时间没有被使用时,或者前台Activity需要更多资源时,系统将这个后台进程关闭,以达到管理内存的目的。

针对第三种情况,因为Activity的停止是由系统造成的,系统会为用保存的数据记录(Activity被Destory时的状态)来重新创建一个新的实例。默认情况下,系统会采用Bundle对象保留每个视图对象的信息。

为了让用户可以保存额外更多的数据,系统提供了一个onSaveInstance()方法。 当Activity被异常destory时,系统会调用这个方法,保存数据信息,存在Bundle中。之后想重新创建这个Activity实例时,之前的那个Bundle对象会被传递到Activity的onRestoreInstanceState()方法和onCreate()方法中。

通常来讲,有这么几种情况会调用onSaveInstanceState()方法:

1.可以在onCreate方法中拿到保存的数据, 但需要判断是Bundle否为nul。

if (null != saveInstanceState) {

}

2.在onRestoreInstanceState()方法中恢复状态信息,此时不用检查Bundle对象是否为null,因为系统仅仅会在存在需要恢复信息时才会调用onRestoreInstanceState()方法。也就是说,onRestoreInstanceState()方法执行时, Bundle肯定不会为null的。

关于onRestoreInstanceState方法,需要注意一下 首先明确一点是这个方法和onSaveInstance方法并不一定配对出现。也就是说,当一个Activity切换到不可见状态时执行了onSaveInstance方法,再由不可见状态切换到可见状态时不一定会执行onRestoreInstanceState方法。onRestoreInstanceState被调用的前提是,activity 确实被系统销毁了。比如,当前的机上显示的是Activity A, 当用户按HOME键后我们可以观察到onSaveInstanceState方法执行了,接着用户又返回到Activity A, 而此时,Activity A并没有被销毁,所以onRestoreInstanceState不会执行。来做两个实验:

实验一

由 activity A 跳转到 activity B 时,不手动调用activity A 的finish方法。

接着点物理Back键

此时发现onRestoreInstanceState方法也没有执行。

实验二

如果我们在activity A 屏上旋转屏幕,会发现其生命周期方法执行如下

onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

此处因为activity重新创建了,故onRestoreInstanceState方法执行了