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

Android Activity生命周期详解

2014-04-29 15:57 267 查看
要毕业了,最近面试了几家公司,个人觉得问的最多的就是activity的生命周期,自己来作一个总结吧。
activity作为和用户交互的组件,为用户提供一个屏幕,完成交互。在开发中,我们可以灵活运用其生命周期,完成许多功能。

Activity 栈
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。Activity 的状态与它在栈中的位置关系如下图所示:
图 1(转). Activity 的状态与它在栈中的位置关系



 
如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。(这里面还有相关的activity启动模式,以后再总结吧)
Activity的生命周期
官方提供的activity生命周期转换,一看的确是准确明了,但是具体内容还是得自己亲测才容易理解一些。



 activity的生命如图所示:onCreate(),onStart(),onResume(),onPause(),onStop(),onRestart(),onDestroy();
最常见的面试题是:A->B B->A .A 和B的生命周期变化?在什么情况下OnRestart()会执行?在程序编写的时候你是怎么利用activity的生命周期的?
(1)A->B B->A.A和B的生命周期变化
A :OnCreate->OnStart->OnResume    OnPause  ->OnStop OnCreate->OnStart->OnResume
B: OnCreate->OnStart->OnResume     OnPause  ->OnStop
以上是A、B之间利用button跳转。
(2)当A->B 在B界面执行Back键。。B的生命周期变化是:OnPause->OnStop->OnDestroy 原因是系统默认Back键,用户该Activity操作已执行完成,调用了OnDestroy方法。A的生命周期是:OnRestart->OnStart->OnResume. 此处就调用了OnRestart..还有就是用户按了Home键。在该应用程序还没把系统回收前,再次启动,调用的也是OnRestart->OnStart->OnResume.( 还有就是该Activity有dialog启动到activity前时该activity还是算可见,会直接OnPause->OnResume,不回OnRestart)
(3)在程序编写时,一般将一些初始化操作放在onCreate里面,OnStart说实话我用的比较少,网上我查了下,也没查出个所以然来。OnResume和OnPause一般都是连着用的,可以用于刷新界面,OnPause一般用来保存持久的数据,像ContentProvider等。下面是转的别个的介绍:

Activity完整的生命周期

完整的Activity生命周期之间从调用的OnCreate开始,到调用onDestroy结束。有可能在某些情况下,一个Activity被终止时并不调用onDestroy方法。

使用OnCreate方法来初始化你的Activity:初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程。在OnCreate方法传递的对象Bundle包含最后一次调用onSaveInstanceState保存的UI状态。你可以使用这个Bundle恢复用户界面到以前的状态,无论是在OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法。

覆盖onDestroy方法来清理OnCreate中创建的任何资源,并确保所有外部连接被关闭,例如网络或数据库的联系。

为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响。如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为它仅调用一次在一个Actvity的完整生命周期中。
Activity可见的生命周期

一个Activity可见的生命周期始于OnStart调用,结束于OnStop调用。在这两个方法中间,你的Actvity将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。在一个Activity完整的生命周期中可能会经过几个Activity可见的生命周期,因为你的Activity可能会经常在前台和后台之间切换。在极端情况下,OPhone Runtime将杀掉一个Activity即使它在可见状态并且并不调用onStop方法。

OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序。当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序。

onRestart方法优先于onStart被调用当一个Activity被重现可见时,使用它你可以实现一些Activity重新可见时的特殊的处理。

OnStart / OnStop方法也被用来注册和注销专门用于更新用户界面Intent接收者。
Activity活跃的生命周期

一个Activity活跃的生命周期始于OnResume调用,结束于OnPause调用。一个活跃的Actvity总是在前台并且接收用户输入事件。当一个新的Actvity启动,或该设备进入休眠状态,或失去焦点,Activity活跃的生命周期就结束了。尽量在onPause和onResume方法中执行较量轻的代码以确保您的应用程序能够快速响应Acitvity在前台和后台之间切换。 

在调用onPause之前,onSaveInstanceState会被调用。这个方法提供了一个机会保存当前的UI状态到Bundle当中。Bundle信息将会被传递到OnCreate和onRestoreInstanceState方法。使用onSaveInstanceState保存UI状态(如检查按钮状态,用户焦点,未提交用户输入)能够确保目前相同的用户界面当Activity下次被激活时。在Activity活跃生命周期中,你可以安全地认为onSaveInstanceState和onPause将被调到即使当前进程将终止。

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息