一、Activity基本概念

Activity是安卓开发中的重要组件,它为用户提供了基本的屏幕交互空间。简单来说,我们直观看到的应用可操作界面,其基础就是托管的activity。

一个应用通常由多个activity组成,一个activity可以启动另外一个acitvity,新的activity称为子activity,其父activity将会自动停止,并被压入stack,当子activity返回时,再从stack中弹出父activity。

 

二、Activity的生命周期

安卓官方文档有句话:开发一个强大和灵活的应用程序,实现Activity的回调方法来管理其生命周期尤为重要。

所以,弄清楚Acitvity的整个生命周期,是后期开发复杂应用的基础。

 

1.生命周期的控制

Activity完整的生命周期为从onCreate()到onDestroy()之间的所有过程,如下图:

activity android 开发中 没有界面 安卓开发activity_sed

Activity的生命周期主要由安卓系统托管。开发人员能控制的一般只有start(startActivity())与shut down(finish())Activity。

而其他的onXXX()方法,均是由安卓系统根据不同的外部状况来进行调用,开发人员不能直接参与控制。

也就是说,开发者并不能控制生命周期的转换,但是,我们可以通过回调方法onXXX()来控制应用在各个生命周期的表现。

所以,开发者需要了解:

  • 生命周期在何时会发生变化
  • 发生变化时,我们能够干什么

 

2.生命周期在何时会发生变化 以及 我们能做什么

  • activity的完整生命周期在onCreate()和onDestroy()调用之间发生。你的activity应该在 onCreate() 方法里完成所有“全局global”状态的设置(比如定义layout), 而在onDestroy() 方法里释放所有占用的资源。 例如,如果你的activity有一个后台运行的线程,用于从网络下载数据,那么你应该在 onCreate() 方法里创建这个线程并且在 onDestroy() 方法里停止这个线程。
  • activity的可见生存期会在 onStart() 调用和 onStop() 调用之间发生。在这期间,用户可在屏幕上看见这个activity并可与之交互。 例如,当一个新的activity启动后调用了 onStop() 方法,则这个activity就无法被看见了。 在这两个方法之间,你可以管理那些显示activity所需的资源。例如,你可以在 onStart() 方法里注册一个 BroadcastReceiver 用于监控影响用户界面的改动。并且当用户不再看到你的显示内容时,在 onStop() 方法里注销掉它。 系统会在activity的整个生存期内多次调用 onStart() 和onStop(), 因为activity可能会在显示和隐藏之间不断地来回切换。
  • activity的前台生存期会在 onResume() 调用和 onPause() 之间发生。在这期间,activity是位于屏幕上所有其它的activity之前,并且拥有用户的输入焦点。 activity可以频繁地进入和退出前台——例如, 当设备进入休眠时或者弹出一个对话框时, onPause() 就会被调用。因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当地轻量化。

可见生存期和前台生存期似乎有点让人迷惑,具体是这样的:

activity可能处于三种基本的状态:

Resumedactivity在屏幕的前台并且拥有用户的焦点。(这个状态有时也被叫做“running”。) Paused另一个activity在前台并拥有焦点,但是本activity还是可见的。 也就是说,另外一个activity覆盖在本activity的上面,并且那个activity是部分透明的或没有覆盖整个屏幕。 一个paused的activity是完全存活的(Activity 对象仍然保留在内存里,它保持着所有的状态和成员信息,并且保持与window manager的联接),但在系统内存严重不足的情况下它能被杀死。 Stopped本activity被其它的activity完全遮挡住了(本activity目前在后台)。 一个stopped的activity也仍然是存活的(Activity 对象仍然保留在内存中,它保持着所有的状态和成员信息,但是不再与window manager联接了)。 但是,对于用户而言它已经不再可见了,并且当其它地方需要内存时它将会被杀死。

如果activity被paused或stopped了,则系统可以从内存中删除它,通过请求finish(调用它的 finish() 方法)或者直接杀死它的进程。 当这个activity被再次启动时(在被finish或者kill后),它必须被完全重建。