第三章Android应用的基本组件与通信Android应用程序是由一个或者多个基本组件组成,本章节会对Android当中一些常用的组件进行介绍。3.1AndroidManifest.xml文件AndroidManifest.xml是Android应用程序的清单文件,是一个完整项目的必须文件。它是整个Android应用程序的全局描述文件,通过该清单文件中的说明,可以了解到如应用的名称、使用的图标以及其包含的组件等信息。而其他的应用程序组件除BroadcaseReceiver可以在代码中声明以外,其他组件必须在该文件中进行声明,否则系统无法使用该组件。AndroidManifest文件主要包括以下信息:a.应用程序的包名,该包名会作为该应用程序的唯一标识。b.应用程序所包含的组件,说明描述中除了该组件的名称外,还需要声明该组件的一些其它信息,如Intent对象的过滤规则等。c.声明应用程序使用系统的权限。d.声明其它应用程序访问该程序锁需要的权限。e.应用程序兼容的最低版本。参看到第一章的HelloAndroid当中的AndroidManifest文件如下图。从上图可以看到AndroidManafest文件的基本结构。所有的信息都是写在manifest标记当中的,该标记的常用属性有如下表。标记属性描述说明manifestpackage应用程序包名versionCode内部版本号versionName用户版本号在manifest中必须包含有application。所有的组件如Activity等均在该标记中声明。除application外manifest中海可以包含uses-permission、uses-sdk等标记。下表是manifest中可包含的字标记及常用属性说明。标记属性描述说明applicationicon应用程序图标,其值必须为drawale资源的应用label应用程序名称permission应用程序的使用者与应用程序交互所必须具有的权限uses-permissionname应用程序运行所需授予的权限uses-sdkminSdkVersion应用程序兼容的最低API版本targetSdkVersion应用程序的目标版本maxSdkVersion应用程序运行的最高版本,如系统版本高过该版本则应用程序不能安装针对上表中的uses-permisson,实际上是由Android提供的,这些权限位于Manifest.permission类中。常用的权限如下表,在程序代码需要的时候添加。权限名说明ACCESS_NETWORK_STATE允许应用程序获取网络状态信息的权限ACCESS_WIFI_STATE允许应用程序获取WIFI网络状态信息权限BATTERY_STATS允许应用程序获取电池状态信息的权限BLUETOOTH允许应用程序连接匹配蓝牙设备的权限BLUETOOTH_ADMIN允许应用程序发现匹配蓝牙设备的权限BROADCAST_SMS允许应用程序广播收到信息提示的权限CALL_PHONE允许应用程序拨打电话的权限CAMERA允许应用程序使用照相机的权限CHANGE_NETWORK_STATE允许应用程序更改网络连接状态的权限CHANGE_WIFI_STATE允许应用程序更改WIFI状态的权限DELETE_CACHE_FILES允许应用程序删除缓存文件的权限DELETE_PACKAGES允许应用程序删除安装包的权限FLASHLIGHT允许应用程序访问闪光灯的权限INTERNET允许应用程序打开网络套接字的权限MODIFY_AUDIO_SETTINGS允许应用程序修改全局声音设置的权限PROCESS_OUTGOING_CALLS允许应用程序监听控制取消呼出电话权限READ_CONTACTS允许应用程序读取用户的联系人数据权限READ_HISTORY_BOOKMARKS允许应用程序读取历史书签的权限READ_PHONE_STATE允许应用程序读取电话状态的权限READ_SMS允许应用程序读取短信的权限REBOOT允许应用程序重启系统的权限RECEIVE_MMS允许应用程序接收监控和处理彩信的权限RECEIVE_SMS允许应用程序接受监控和处理短信的权限RECORD_AUDIO允许应用程序录音的权限SEND_SMS允许应用程序发送短信的权限SET_ORIENTATION允许应用程序旋转屏幕的权限SET_TIME允许应用程序设置时间的权限SET_TIME_ZONE允许应用程序设置时区的权限SET_WALLPAPER允许应用程序设置桌面壁纸的权限VIBRATE允许应用程序访问振动器的权限WRITE_CONTACTS允许应用程序写入用户联系人的权限WRITE_HISTORY_BOOKMARKS允许应用程序写入用户联系人的权限WRITE_SMS允许应用程序写短信的权限application组件中包含了应用程序的各种组件的标记,如activity、receiver等等。这些标记中很多属性跟application中的属性名相同。如果进行设置将会覆盖掉application中的同名属性。application标记可包含的子标记及其属性说明如下表:标记属性描述说明activityservicereceiverprovidername组件类的类名,可以是全称的类名,也可以是以”.”开头省略掉应用程序的报名,后直接加上类名process组件应该运行在哪个进程当中,默认是运行在同一个进程中permission启动组件需要的权限activityscreenOrientation屏幕的方向providerreadPermission应用程序被调用时查询contentprovider中数据所需要的权限writePermission应用程序被调用时修改contentprovider中数据所需要的权限uses-libraryname应用程序会链接到的除默认Android类库外的库在这些子标记中还可以添加intent-filter标记,该标记即为该组件的intent过滤器,intent-filter标记当中的属性及说明如下表:标记属性描述说明intent-filtericon图标,必须为drawable资源的引用label名称priority处理Intent时的优先级。对activity和broadcastreceiver有效,属性值越高,优先级越高。intent-filter标记中又可以添加action、data等子标记。其中action是必须包含在内的,可以为多个。详细说明见下表:标记属性描述说明actionname为intentfilter添加一个action,值可以是Intent类的常量,也可以为自定义的action,如果是自定义那需要加上包名作为前缀categoryname为intentfilter添加一个category,值可以是Intent类的常量,也可以为自定义的category,如果是自定义那需要加上包名作为前缀dataschemeURI中的scheme部分,必须至少设置一个scheme属性,否则其他的URI属性将无效hostURI中的host部分,必须为小写字母,该属性需要设置了scheme属性才有效portURI中的port,该属性需要设置了scheme和host属性才有效以上为AndroidManifest配置文件中一些常见的标记和属性等的说明介绍,具体的用法会在下节讲解对应组件的时候运用。3.2Activity与基本通信3.2.1Activity与ViewActivity是最常见的组件,每个Activity都相当于一个屏幕,为用户提供进行交互的可视界面,一个应用程序可以包含一个或者多个Activity,Activity一般都继承自android.app包下的Activity类。Activity的生命周期。生命周期包括四个阶段:1.活动状态:Activity处于可视状态可以获得焦点。2.暂停状态:Activity可见但是不能获得焦点。3.停止状态:Activity处于不可见状态。4.销毁状态:Activity结束,或Activity所在的Dalvik进程被结束。从图中可以看出Activity生命周期中有七个方法会被系统回调。onCreate:创建Activity时被调用。onStart:启动Activity时被调用。onRestart:重启Activity时候被调用。onResume:恢复Activity时被调用。onPause:暂停Activity时被调用。onStop:停止Activity时被调用。OnDestroy:销毁Activity时被调用。测试上述七个生命周期的调用实例:1.创建一个TestActivity的项目。2.打开自动生成的java源文件,覆盖Activity当中的七个生命周期方法。在每个方法当中写上相应的打印语句作为提示,代码当中添加了个Button,并对Button实现了监听,按下按钮退出。如上代码,xml文件参照前面章节内容。3.为看运行结果,需要在DDMS当中添加一个打印语句的过滤器,查看输出的结果。如下图,当程序启动时打印了前三句,启动后按键盘上的Home键,打印接下来的pause和stop,再重新选择应用程序进入打印接下来的三句,按下退出按钮,退出程序打印最后三句。View是所有UI组件、容器组件的父类。Activity通过setContentView来显示指定的组件。第二章当中讲解了部分View的直接或间接子类。在后续章节当中还会详细的来介绍。3.2.2Intent与IntentFilterIntent类的对象有两种用途,一种是用来启动系统的组件,这些组件包括有Activity、Service、BroadcastReceiver,另外Intent类对象还可以作为组件间通信的载体。首先来看看Intent启动不同组件所要使用的方法。见下表。组件方法ActivitystartActivity(Intentintent)startActivityForResult(Intentintent,intrequestCode)ServicestartService(Intentservice)bindService(Intentservice,ServiceConnectionconn,intflags)BroadcastReceiversendBroadcast(Intentintent)sendBroadcast(Intentintent,StringreceiverPermission)sendOrderedBroadcast(Intentintent,StringreceiverPermission,BroadcastReceiverresultReceiver,Handlerscheduler,intinitialCode,StringinitialData,BundleinitialExtras)sendOrderedBroadcast(Intentintent,StringreceiverPermission)sendStickyBroadcast(Intentintent)sendStickyOrderedBroadcast(Intentintent,BroadcastReceiverresultReceiver,Handlerscheduler,intinitialCode,StringinitialData,BundleinitialExtras)通过上表了解了启动相应组件的方法。接下来就来看看Intent对象的属性。Intent对象属性有六个部分。1.ComponentName部分组件名称指明了要处理的Intent的组件,组件名称封装在一个ComponentName对象中,该对象用于惟一标识一个应用程序组件,如Activity、Service、