本章要求:第5章深入理解Activity1在AndroidManifest.xml主设置文件中配置2Activity3在程序中演示Activity的生命周期4新建一个Activity5启动一个或多个Activity6在多个Activity之间实现相互传值5.1Android核心对象——Activity5.2创建、启动和关闭Activity5.3多个Activity的使用5.4综合实例——带选择头像的用户注册界面第5章深入理解ActivityActivity是Andorid系统中最基本也是最为常用的组件,在一个Android程序中,一个Activiy通常就是一个单独的屏幕,本章将对Activity进行详细讲解。第5章深入理解Activity5.1.1Activity概述5.1.2Activity的四种状态5.1.3Activity的生命周期5.1.4Activity的属性5.1Android核心对象——ActivityActivity是Android程序中最基本的模块,它是为用户操作而展示的可视化用户界面,一个Android应用程序中可以只有一个Activity,也可以包含多个,每个Activity的作用及其数目,取决于应用程序及其设计。例如,可以使用一个Activity展示一个菜单项列表供用户选择,也可以显示一些包含说明的照片等。Activity窗口显示的可视内容是由一系列视图构成的,这些视图均继承自View基类。每个视图均控制着窗口中一块特定的矩形空间,父级视图包含并组织其子视图的布局,而底层视图则在它们控制的矩形中进行绘制,并对用户操作做出响应,所以,视图是Activity与用户进行交互的界面。比如说,开发人员可以通过视图显示一个图片,然后在用户单击它时产生相应的动作。说明:Android中有很多既定的视图供开发人员直接使用,比如按钮、文本域、卷轴、菜单项、复选框等。5.1.1Activity概述Activity作为Android应用程序最重要的一部分,它主要有4种状态,分别如下:Runing状态:一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。如图5-1所示为一个Activity的Runing状态。图5-1Activity的Runing状态图5-2Activity的Paused状态5.1.2Activity的四种状态Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点,故不可与用户交互。如图5-2所示为一个Activity的Paused状态。Stopped状态:当Activity不可见时,Activity处于Stopped状态。Activity将继续保留在内存中保持当前的所有状态和成员信息,假设系统别的地方需要内存的话,这时它是被回收对象的主要候选。当Activity处于Stopped状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。Killed状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这时Activity已被移除Activity堆栈中,需要重新启动才可以显示和使用。说明:Android的4种状态中,Runing状态和Paused状态是可见的,而Stopped状态和Killed状态是不可见的。开发程序时,生命周期是大部分对象都需要考虑的一个问题,对象的生命周期一般都是从创建开始,到销毁结束,而Activity作为Android程序中的一个核心窗口对象,在使用时,有其特殊的生命周期,本节将对Activity的生命周期进行详细讲解。1.Activity生命周期概述Android程序创建时,系统会自动在其.java源文件中重写Activity类的onCreate方法,该方法是创建Activity时必须调用的一个方法,另外,Activity类中还提供了诸如onStart、onResume、onPause、onStop和onDestroy等方法,这些方法的先后执行顺序构成了Activity对象的一个完整生命周期。图5-3是Android官方给出的Activity对象生命周期图。5.1.3Activity的生命周期可视生命周期完整生命周期前台生命周期图5-3Activity对象生命周期图5-3所示的Activity对象生命周期图中涉及到了onCreate、onStart、onResume、onPause、onStop和onDestroy等7个方法,这7个方法定义了Activity的完整生命周期,而该完整生命周期又可以分成3个嵌套生命周期循环,分别如下:前台生命周期:自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互,Activity会经常在暂停和恢复之间进行状态转换,例如,当设备转入休眠状态或者有新的Activity启动时,将调用onPause()方法,而当Activity获得结果或者接收到新的Intent时,会调用onResume()方法。可视生命周期:自onStart()调用开始,直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,可以保留用来向用户显示这个Activity所需的资源。例如,当用户看不到显示的内容时,可以在onStart()中注册一个BroadcastReceiver广播接收器来监控可能影响UI的变化,而在onStop()中来注消。onStart()和onStop()方法可以随着应用程序是否被用户可见而被多次调用。完整生命周期:自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上下载数据,它会在onCreate()创建线程,而在onDestroy()销毁线程。2.Activity的方法上一节中讲解了Activity的生命周期,其中主要涉及到了onCreate、onStart、onResume、onPause、onStop和onDestroy等7个方法,下面分别对这7个方法进行介绍。onCreate方法onCreate方法用来创建Activity,其覆写形式如下:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}说明:覆写Activity的相关方法时,可以通过Eclipse中的“源代码”/“覆盖/实现方法”菜单实现,具体步骤为:选择该菜单,在弹出的“覆盖/实现方法”对话框(如图5-4所示)中选中要覆写方法前面的复选框,单击“确定”按钮即可。图5-4“覆盖/实现方法”对话框选中要覆写方法前面的复选框onStart方法onStart方法用来启动Activity,其覆写形式如下:@OverrideprotectedvoidonStart(){//TODOAuto-generatedmethodstubsuper.onStart();}onResume方法onResume方法用来恢复Activity,其覆写形式如下:@OverrideprotectedvoidonResume(){//TODOAuto-generatedmethodstubsuper.onResume();}onPause方法onPause方法用来暂停Activity,其覆写形式如下:@OverrideprotectedvoidonPause(){//TODOAuto-generatedmethodstubsuper.onPause();}onStop方法onStop方法用来停止Activity,其覆写形式如下:@OverrideprotectedvoidonStop(){//TODOAuto-generatedmethodstubsuper.onStop();}onRestart方法onRestart方法用来重启Activity,其覆写形式如下:@OverrideprotectedvoidonRestart(){//TODOAuto-generatedmethodstubsuper.onRestart();}onDestroy方法onDestroy方法用来销毁Activity,其覆写形式如下:@OverrideprotectedvoidonDestroy(){//TODOAuto-generatedmethodstubsuper.onDestroy();}【例5-1】在Eclipse中创建Android项目,主要通过onCreate、onStart、onResume、onPause、onStop和onDestroy等7个方法的调用,演示Activity的生命周期。(实例位置:光盘\MR\源码\第5章\5-1)在创建Android项目时,由于onCreate方法默认进行覆写,所以在创建的Android项目中覆写另外6个方法onStart、onResume、onPause、onStop和onDestroy,并分别在这7个方法的方法体内使用Log.i方法输出对应的方法名,代码如下:@OverridepublicvoidonCreate(BundlesavedInstanceState){//创建Activitysuper.onCreate(savedInstanceState);setContentView(R.layout.main);Log.i(ACTIVITY,MainActivity==)onCreate);}@OverrideprotectedvoidonDestroy(){//销毁Activity//TODOAuto-generatedmethodstubsuper.onDestroy();Log.i(ACTIVITY,MainActivity==》onDestroy);}@OverrideprotectedvoidonPause(){//暂停Activity//TODOAuto-generatedmethodstubsuper.onPause();Log.i(ACTIVITY,MainActivity==》onPause);}@OverrideprotectedvoidonRestart(){//重启Activity//TODOAuto-generatedmethodstubsuper.onRestart();Log.i(ACTIVITY,MainActivity==》onRestart);}@OverrideprotectedvoidonResume(){//恢复Activity//TODOAuto-generatedmethodstubsuper.onResume();Log.i(ACTIVITY,MainActivity==》onResume);}@OverrideprotectedvoidonStart(){//启动Activity//TODOAuto-generatedmethodstubsuper.onStart();Log.i(ACTIVITY,MainActivity==》onStart);}@OverrideprotectedvoidonStop(){//停止Activity//TODOAuto-generatedmethodstubsuper.onStop();Log.i(ACTIVITY,MainActivity==)onStop);}运行本实例,当第一次运行后,在LogCat管理