Android Activity---管理Activity的生命周期

来源:互联网 发布:鼎尖软件 编辑:程序博客网 时间:2024/04/29 17:45
通过实现回调方法来管理Activity的生命周期是开发强壮和灵活应用程序的关键。Activity的生命周期直接受到与之相关的Activity、任务和回退堆栈的影响。

Activity存在基本的三种状态:

恢复态(Resumed)、

这种状态下,Activity在屏幕的前端,并有有用户焦点(这种状态有时也叫“运行态”)

 

暂停态(Paused)

这种状态下的Activity,另一个Activity在这个Activity的前端,并且拥有焦点,但是这个Activity依然可见,也就是说,在这个Activity之上的另一个Activity是可见的,并且那个Activity是部分透明或没有覆盖整个屏幕。一个暂停态的Activity是完全活动着的(这个Activity对象被保留在内存中,它保持着所有的状态和成员信息,并且依然依附于窗口管理器),但是在内存极低的情况下,能够被系统清除。

 

终止态(Stopped)

这种状态下的Activity完全被另一个Activity屏蔽(这个Activity保持在后台)。被终止的Activity也依然存活着(这个Activity对象被保留在内存中,他保持所有的状态和成员信息,但是不依附于窗口管理器)。而且,对用户它不再可见,并且在任何需要内存的时候,它都可以被系统清除。

 

如果Activity处于暂停或终止态,系统既可以通过询问的方式用finish()方法把它从内存中删除,也可以简单的杀死这个进程。但是当Activity被重新打开时,它必须重新创建所有的内容。

 

实现生命周期的回调

当Activity在之上描述的不同状态间转换时,通过各种回调方法获取通知。所有的回调方法都可以重写,用于处理Activity的状态改变时对应的工作。以下的代码骨架包含了Activity的每个基本生命周期的方法:

public class ExampleActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // The activity is being created.    }    @Override    protected void onStart() {        super.onStart();        // The activity is about to become visible.    }    @Override    protected void onResume() {        super.onResume();        // The activity has become visible (it is now "resumed").    }    @Override    protected void onPause() {        super.onPause();        // Another activity is taking focus (this activity is about to be "paused").    }    @Override    protected void onStop() {        super.onStop();        // The activity is no longer visible (it is now "stopped")    }    @Override    protected void onDestroy() {        super.onDestroy();        // The activity is about to be destroyed.    }}

在你实现这些生命周期方法时,做任何工作之前,都必须像上面的例子那样调用父类的实现,综合而言,这些方法定义了Activity的完整的生命周期。通过实现这些方法,你能够在Activity的生命周期中循环监视这三种状态:

Activity的整个生命时发生在调用onCreate()方法和调用onDestroy()方法之间。你的Activity应该在onCreate()方法中执行全局状态创建工作,在onDestroy()方法中释放所有的保留的资源。例如,如果你的Activity有一个运行在后台,从网络上下载数据的线程,可以在onCreate()方法中创建这个线程,并且在onDestroy()方法中终止这个线程。 

Activity可见生命时发生在调用onStart()方法和调用onStop()方法之间。在这期间,用户能够在屏幕上看到这个Activity,并且可以和它交互。例如,当一个新的Activity启动时,onStop()方法被调用,并且这个Activity不再可见。这两个方法之间,你能保持显示给用户的Activity所需要的资源。例如,你能够在onStart()方法中注册一个广播接收器来监视你的UI的改变,并且在onStop()方法中解除注册(用户不能再看到Activity显示的内容)。在Activity整个生命期间,当Activity在显示和隐藏之间切换时,系统可以多次调用onStart()和OnStop()方法。

 

Activity的前台生命时发生在调用onResume()方法和onPause()方法之间,在这期间,这个Activity在屏幕上所有可见的其他Activity之前,并且有用户输入焦点。Activity能够在前台频繁的切入、切出---例如,当设备休眠或对话框显示时,onPause()方法被调用。因为这个状态能够经常的转换,因此在这两个方法中代码应该尽量轻量级,以避免过慢的切换而让用户等待。

图1说明了这些循环和状态之间转换可能的路径。矩形代表了Activity在状态间切换是需要实现的执行操作的回调方法。


图1 Activity生命周期

 

在表1中列出了与上图相同的生命周期回调方法,更详细的介绍了每个回调方法,并且定位到Activity整个生命周期的每个方法,包括系统是否能够在会回调方法执行完成之后杀死这个Activity。

表1 Activity生命周期的回调方法概要:

方法

描述

执行之后能够杀死吗?

下一个回调

onCreate()

Activity被首次创建时调用这个方法()。你应该在这个方法中创建所有的全局资源,如视图、把数据绑定到列表等等。如果这个状态被捕获,就会给这个方法传递一个包含Activity前一个状态的Bundle对象。(可以查看稍后的保存Activity状态)。

跟随其后的总是onStart()方法

No

onStart()

onRestart()

在Activity被终止之后,重启之前调用这个方法

跟随其后的总是onStart()方法

No

onStart()

onStart()

在Activity显示给用户之前调用这个方法,如果Activity要显示在前台,接下来要调用onResume()方法,如果被隐藏接下来要调用onStop()方法。

No

onResume()

onStop()

onResume()

只在Activity和用户交互之前调用这个方法。这时,Activity在Activity堆栈的顶部,能够接受用户的输入。

跟随其后的总是onStart()方法

No

onPause()

onPause()

当系统开始恢复另外一个Activity是调用这个方法。通常,用这个方法来提交那些未保存的改变使数据持久化,终止动画和其他的可能消耗CPU的操作等等。无论怎样,它都应该被很快的调用,因为接下来直到Activity返回它才会被恢复。

接下来再Activity返回到前台时,要调用onResume()方法,在隐藏的时候要调用onStop()方法

Yes

onResume()

onStop()

onStop()

当Activity不再显示给用户时调用这个方法,因为Activity被销毁或者因为另一个Activity(既可以是既存的也可以是新创建的)被恢复并且覆盖它,这个方法就被调用了。

如果Activity从后台返回前台与用户交互,就调用onRestart()方法,如果Activity被清除就调用onDestroy()方法

Yes

onRestart()

onDestroy()

onDestroy()

在Activity被销毁之前调用这个方法。这是Activity收到的最后的调用。既可以因为finish()方法的调用而调用,也可以因为系统临时销毁了这个Activity实例来释放空间而调用。你能够使用isFinished()方法来区分这两种场景。

Yes

Nothing

 

“执行之后能够杀死吗?”列指示了系统能否在回调方法执行之后不执行Activity其他代码行的任何时候可能杀死拥有这个Activity的进程。有三个方法标记了“Yes”:(onPause(),onStop()和onDestroy())。在这三个方法中,因为onPause()是最先被调用的,所以Activity一旦被创建,在进程被杀死前能够保证被调用的最后的方法---如果系统在紧急的情况下必须恢复内存,那么onStop()和onDestroy()方法就可能不被调用了。因此,你应该使用onPause()方法来写关键的持久化数据代码用于保存数据。但是,你应该选择在onPause()期间什么信息是必须保留的,因为在这个方法中的任何处理都会锁定系统向下一个Activity转换,如果处理比较慢会影响流畅的用户体验。

“执行之后能够杀死吗?”列中标记了“No”的列回调方法保证了拥有Activity的进程在这些方法被调用后的瞬间被杀死。因此,Activity在从onPause()方法返回到onResume()方法之前是可杀死的。直到onPause()方法被再次调用并返回的时候进程才是可杀死的。

注:Activity不通过表1中定义的技术型可杀死的方法依然可被系统杀死---但这只在没有资源的极端情况情况下才发生。关于Activity可被杀死的时机将在Processes and Threading(进程和线程)的文档做更多的讨论。


注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。

如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar



原创粉丝点击