第二章Android生命周期与组件通信1主要内容2.1Android生命周期2.2Activity组件2.3Intent信使2程序的生命周期程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android程序启动到停止的全过程。程序的生命周期由Android系统进行调度和控制的。Android系统中的进程优先级由高到低前台进程可见进程服务进程后台进程空进程前台进程高优先级中优先级低优先级可见进程服务进程后台进程空进程3前台进程前台进程是Android系统中最重要的进程,是与用户正在交互的进程,包含以下四种情况。进程中的Activity正在与用户进行交互。进程服务被Activity调用,而且这个Activity正在与用户进行交互。进程服务正在执行声明周期中的回调函数,如onCreate()、onStart()或onDestroy()。进程的BroadcastReceiver正在执行onReceive()函数。Android系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,保证主要的用户界面能够及时响应。4可见进程可见进程指部分程序界面能够被用户看见,却不在前台与用户交互,不响应界面事件的进程。如果一个进程包含服务,且这个服务正在被用户可见的Activity调用,此进程同样被视为可见进程。Android系统一般存在少量的可见进程,只有在特殊的情况下,Android系统才会为保证前台进程的资源而清除可见进程。5服务进程服务进程是指包含已启动服务的进程没有用户界面在后台长期运行Android系统除非不能保证前台进程或可视进程所必要的资源,否则不强行清除服务进程后台进程后台进程是指不包含任何已经启动的服务,而且没有任何用户可见的Activity的进程Android系统中一般存在数量较多的后台进程,在系统资源紧张时,系统将优先清除用户较长时间没有见到的后台进程6空进程空进程是不包含任何活跃组件的进程空进程在系统资源紧张时会被首先清除但为了提高Android系统应用程序的启动速度,Android系统会将空进程保存在系统内存用,在用户重新启动该程序时,空进程会被重新使用除了以上的优先级外,以下两方面也决定他们的优先级进程的优先级取决于所有组件中的优先级最高的部分进程的优先级会根据与其他进程的依赖关系而变化72.2.1Android组件简介2.2.2Activity生命周期2.2.3Task与Activity栈2.2.4Activity基本状态82.2.1Android组件简介组件是可以调用的基本功能模块,Android应用程序就是由组件组成的。Android系统有四个重要的组件,分别是Activity、Service、BroadcastReceiver和ContentProvider。ActivityActivity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件。Android应用程序可以包含一个或多个Activity,一般在程序启动后会呈现一个Activity,用于提示用户程序已经正常启动。在界面上的表现形式:全屏窗体,非全屏悬浮窗体,对话框。ServiceService用于没有用户界面,但需要长时间在后台运行的应用。92.2.1Android组件简介BroadcastReceiverBroadcastReceiver是用来接受并响应广播消息的组件。不包含任何用户界面。可以通过启动Activity或者Notification通知用户接收到重要信息。Notification能够通过多种方法提示用户,包括闪动背景灯、震动设备、发出声音或在状态栏上放置一个持久的图标。ContentProviderContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据。私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库。Android系统内部也提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息。102.2.2Activity生命周期Activity生命周期Activity生命周期指Activity从启动到销毁的过程。Activity表现为四种状态,分别是活动状态、暂停状态、停止状态和非活动状态。活动状态,Activity在用户界面中处于最上层,完全能用户看到,能够与用户进行交互。暂停状态,Activity在界面上被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互。停止状态,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡。非活动状态不在以上三种状态中的Activity则处于非活动状态。112.2.2Activity生命周期Activity的四种状态的变换关系图活动状态停止状态非活动状态暂停状态12举例:建立一个新的Android工程工程名称:Chp02_NewActivity包名称:com.NewActivityActivity名称:NewActivity132.2.2Activity生命周期NewActivity.java文件的代码1packagecom.NewActivity;23importandroid.app.Activity;4importandroid.os.Bundle;5importandroid.widget.Button;6importandroid.widget.TextView;78publicclassNewActivityextendsActivity{9privateTextViewm_txtNewAct=null;10privateButtonm_btnNewAct=null;11/**Calledwhentheactivityisfirstcreated.*/12@Override13publicvoidonCreate(BundlesavedInstanceState){14super.onCreate(savedInstanceState);15setContentView(R.layout.main);16this.m_btnNewAct=(Button)findViewById(R.id.btnNewAct);17this.m_txtNewAct=(TextView)findViewById(R.id.txtNewAct);18this.m_txtNewAct.setText(文本控件);19this.m_btnNewAct.setText(按钮控件);142.2.2Activity生命周期NewActivity.java文件的代码从代码第8行可以看出,一个Activity就是一个Java类,而且必须继承自Activity基类。代码第13行复写了基类的onCreate()方法,并且在14行调用了父类的onCreate()方法,这在创建Activity时同样是必须的,在Activity第一次运行时总会首先执行onCreate()方法,此方法作用类似于其它面向对象语言中的构造函数。代码15行采用setContentView()方法设置布局文件,代码16和17行的findViewById()方法功能是通过控件ID属性获得所需的控件对象,此方法返回View类,View类是android系统的控件基类,可以通过强制类型转换转化成所需的控件对象。代码18行和19行完成相应控件显示文本的设置。20.}21.}15AndroidManifest.xml文件中声明Activity的代码如下:2.2.2Activity生命周期……1applicationandroid:icon=@drawable/iconandroid:label=@string/app_name2activityandroid:name=.NewActivity3android:label=@string/app_name4intent-filter5actionandroid:name=android.intent.action.MAIN/6categoryandroid:name=android.intent.category.LAUNCHER/7/intent-filter8/activity9/application……162.2.2Activity生命周期在应用程序application元素中声明了前面所定义的Activity,在application元素中同样可以声明Service、BroadcastReceiver和ContentProvider。代码第2行属性android:name定义了实现Activity类的名称,其值有两种实现形式,一种是使用全称com.NewActivity,另外一种是使用简化后的类名称.NewActivity,其中的“.”不可省略。第3行属性android:label定义了Activity的标签名称,此名称将在Activity界面上面以标题形式显示,@string/app_name是一种资源引用方式,其真实值是res/values/string.xml文件中app_name元素代表的字符串值。intent-filter元素中包含了两个子元素action和category,这些元素的意义将在后面详细介绍,在这里intent-filter的功能就是设置程序的启动主窗体为包含它的Activity。172.2.2Activity生命周期在创建的Activity上可以按照需要布局必要的界面控件,如上面的Activity上添加了一个按钮(Button)和一个文本框(TextView),其声明的代码如下所示:……1TextView2android:layout_width=fill_parent3android:layout_height=wrap_content4android:id=@+id/txtNewAct5/6Button7android:layout_width=fill_parent8android:layout_height=wrap_content9android:id=@+id/btnNewAct10/……182.2.2Activity生命周期属性android:layout_width定义控件横向宽度,属性android:layout_height定义控件纵向高度,属性android:layout_width和属性android:layout_height的可选值均为fill_parent与wrap_content。fill_parent值代表填充父控件,wrap_content值代表按照内容填充。属性android:id定义控件唯一标识名称,“@+id”告诉系统在R.java文件中生成相应的值。在生命周期中起重要作用的是它的事件回调函数。Activity提供了七个生命周期的事件回调函数,在这些事件回调函数中添加相应的功能代码可以实现或者完成相应的功能。192.2.2Activity生命周期事件的回调函数1.publicclassMyActivityextendsActivity{2.protectedvoidonCreate(BundlesavedInstanceState);3.protectedvoidonStart();4.protectedvoidonRestart();5.protectedvoidonResume();6.protectedvoidonPause();7.protectedvoidonStop();8.protectedvoidonDestroy();9.}2