现在的位置: 首页 > 综合 > 正文

理解Activity的寿命

2012年05月10日 ⁄ 综合 ⁄ 共 1933字 ⁄ 字号 评论关闭


字号:

在Activity的full寿命(介于创建与销毁)里,会穿越一至多次的active和visible寿命。每一次的迁移会触发前面描述的事件处理函数。接下来的章节会对每一种寿命及其包含的事件做一次仔细的端视。

 

full寿命

 

Activity的full寿命发生在第一次调用onCreate和最后调用onDestroy。在某些情况下,可能会存在Activity进程会被终止,而没有调用onDestroy方法。

 

使用onCreate方法初始化你的Activity:创建UI、为类的变量分配引用、绑定数据到控件、创建Service和线程。onCreate方法会传入一个Bundle对象,包含了最后一次调用onSaveInstanceState时保存的UI状态。你应该使用这个Bundle来恢复UI到之前的状态,在onCreate方法或onRestoreInstanceState方法里。

 

Override onDestroy方法来清理在onCreate方法里创建的资源,并且保证所有的外部连接,如网络或数据库链接都关闭。

 

作为书写高效代码的Android向导的一部分,建议避免创建临时的对象。快速的创建和销毁对象会引发额外的垃圾回收,这样会对用户体验有直接的影响。如果你的应用程序正常创建一套对象,建议它们在onCreate方法中创建,因为在Activity的寿命里它只被调用一次。

 

visible寿命

 

Activity的visible寿命以onStart和onStop调用为界限。在这两个调用之间,你的Activity对用户来说是可见的,尽管它可能没有焦点或者可能部分被遮挡。在Activity的full寿命里,可能会好几次穿越visible寿命,因为Activity会在前台和后台之间迁移。在极端的情况下,存在在Activity的visible寿命里,Android运行时会杀死Activity,而不调用onStop的情况。

 

onStop方法应该用来暂停或停止动画、线程、定时器、服务或者其他专门用来更新UI的进程。在Activity不可见时,应该占用极少的资源(例如CPU周期或者网络带宽)去更新UI。当UI再次可见时,使用onStart(或者onRestart)方法来唤醒或重启这些处理。

 

onRestart方法比其它的方法(第一个是onStart)优先调用。在full寿命里,使用它来实现一些你只想在Activity重启时的特殊处理。

 

onStart/onStop方法也常用来注册和反注册Broadcast Receiver来专门更新UI。当Activity变成不可见时,反注册Receiver不总是必要的,尤其当它们用来支持一些动作而不是更新UI时。你将在第5章学到更多关于Broadcast Receiver的使用

 

Active寿命

 

active寿命开始于onResume的调用结束于相应的onPause的调用。

 

Active Activity是运行在前台,接受用户输入的事件。Activity在析构之前可能穿越好几次active寿命,因为当一个新的Activity显示、设备进入睡眠或Activity失去焦点等都会导致active寿命结束。尽量在onPause和onResume方法中保持代码,因为当Activity进入或离开前台时能相对快的、轻量级的保证应用程序响应。

 

在onPause之前,会调用onSaveInstanceState方法。这个方法提供了保存Activity UI状态的机会,这些值保存到Bundle中,将来会传递给onCreate和onRestoreInstanceState 方法。使用onSaveInstanceState方法来保存UI状态(例如,check按钮的状态,用户焦点或用户输入但未提交的信息)以保证Activity再次变成active状态时能够呈现出相同的UI。在整个active寿命期间,你可以认为onSaveInstanceState 和onPause方法在进程终止之前会被调用。

 

大多数Activity的实现至少会override onPause方法来提交未保存的变更,因为它是Activity无任何警告的被杀死的分割点。依据你的应用程序架构,当你的Activity不在前台时,你可能选择中止线程、进程或者Broadcast Receiver。

 

onResume方法是轻量级的。你不需要在这里重新加载UI的状态,如果需要的话,它们已经在onCreate和onRestoreInstanceState 进行了处理。如果你在onPause里停止了Broadcast Recever或其他进程,你可以在onResume方法中重新注册。

抱歉!评论已关闭.