第三章Android应用的基本组件_第1页
第三章Android应用的基本组件_第2页
第三章Android应用的基本组件_第3页
第三章Android应用的基本组件_第4页
第三章Android应用的基本组件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 Android应用的基本组件与通信Android应用程序是由一个或者多个基本组件组成,本章节会对Android当中一些常用的组件进行介绍。3.1 AndroidManifest.xml 文件AndroidManifest.xml是Android应用程序的清单文件,是一个完整项目的必须文件。它是整个Android应用程序的全局描述文件,通过该清单文件中的说明,可以了解到如应用的名称、使用的图标以及其包含的组件等信息。而其他的应用程序组件除Broadcase Receiver可以在代码中声明以外,其他组件必须在该文件中进行声明,否则系统无法使用该组件。AndroidManifest文件主要

2、包括以下信息:a 应用程序的包名,该包名会作为该应用程序的唯一标识。b 应用程序所包含的组件,说明描述中除了该组件的名称外,还需要声明该组件的一些其它信息,如Intent对象的过滤规则等。c 声明应用程序使用系统的权限。d 声明其它应用程序访问该程序锁需要的权限。e 应用程序兼容的最低版本。参看到第一章的HelloAndroid当中的AndroidManifest文件如下图。从上图可以看到AndroidManafest文件的基本结构。所有的信息都是写在标记当中的, 该标记的常用属性有如下表。标记属性描述说明package应用程序包名versionCode内部版本号versionName用户版本

3、号在中必须包含有。所有的组件如Activity等均在该标记中声明。除外中海可以包含、等标记。下表是中可包含的字标记及常用属性说明。标记属性描述说明icon应用程序图标,其值必须为drawale资源的应用label应用程序名称permission应用程序的使用者与应用程序交互所必须具有的权限name应用程序运行所需授予的权限minSdkVersion应用程序兼容的最低API版本targetSdkVersion应用程序的目标版本maxSdkVersion应用程序运行的最高版本,如系统版本高过该版本则应用程序不能安装针对上表中的,实际上是由Android提供的,这些权限位于Manifest.perm

4、ission类中。常用的权限如下表,在程序代码需要的时候添加。权限名说明ACCESS_NETWORK_STATE允许应用程序获取网络状态信息的权限ACCESS_WIFI_STATE允许应用程序获取WIFI网络状态信息权限BATTERY_STATS允许应用程序获取电池状态信息的权限BLUETOOTH允许应用程序连接匹配蓝牙设备的权限BLUETOOTH_ADMIN允许应用程序发现匹配蓝牙设备的权限BROADCAST_SMS允许应用程序广播收到信息提示的权限CALL_PHONE允许应用程序拨打电话的权限CAMERA允许应用程序使用照相机的权限CHANGE_NETWORK_STATE允许应用程序更改网

5、络连接状态的权限CHANGE_WIFI_STATE允许应用程序更改WIFI状态的权限DELETE_CACHE_FILES允许应用程序删除缓存文件的权限DELETE_PACKAGES允许应用程序删除安装包的权限FLASHLIGHT允许应用程序访问闪光灯的权限INTERNET允许应用程序打开网络套接字的权限MODIFY_AUDIO_SETTINGS允许应用程序修改全局声音设置的权限PROCESS_OUTGOING_CALLS允许应用程序监听控制取消呼出电话权限READ_CONTACTS允许应用程序读取用户的联系人数据权限READ_HISTORY_BOOKMARKS允许应用程序读取历史书签的权限RE

6、AD_PHONE_STATE允许应用程序读取电话状态的权限READ_SMS允许应用程序读取短信的权限REBOOT允许应用程序重启系统的权限RECEIVE_MMS允许应用程序接收监控和处理彩信的权限RECEIVE_SMS允许应用程序接受监控和处理短信的权限RECORD_AUDIO允许应用程序录音的权限SEND_SMS允许应用程序发送短信的权限SET_ORIENTATION允许应用程序旋转屏幕的权限SET_TIME允许应用程序设置时间的权限SET_TIME_ZONE允许应用程序设置时区的权限SET_WALLPAPER允许应用程序设置桌面壁纸的权限VIBRATE允许应用程序访问振动器的权限WRITE

7、_CONTACTS允许应用程序写入用户联系人的权限WRITE_HISTORY_BOOKMARKS允许应用程序写入用户联系人的权限WRITE_SMS允许应用程序写短信的权限组件中包含了应用程序的各种组件的标记,如、等等。这些标记中很多属性跟中的属性名相同。如果进行设置将会覆盖掉中的同名属性。标记可包含的子标记及其属性说明如下表:标记属性描述说明name组件类的类名,可以是全称的类名,也可以是以”.”开头省略掉应用程序的报名,后直接加上类名process组件应该运行在哪个进程当中,默认是运行在同一个进程中permission启动组件需要的权限screenOrientation屏幕的方向readPe

8、rmission应用程序被调用时查询content provider中数据所需要的权限writePermission应用程序被调用时修改content provider中数据所需要的权限name应用程序会链接到的除默认Android类库外的库在这些子标记中还可以添加标记,该标记即为该组件的intent过滤器,标记当中的属性及说明如下表:标记属性描述说明icon图标,必须为drawable资源的引用label名称priority处理Intent时的优先级。对activity和broadcast receiver有效,属性值越高,优先级越高。标记中又可以添加、等子标记。其中是必须包含在内的,可以为

9、多个。详细说明见下表:标记属性描述说明name为intent filter添加一个action,值可以是Intent类的常量,也可以为自定义的action,如果是自定义那需要加上包名作为前缀name为intent filter添加一个category,值可以是Intent类的常量,也可以为自定义的category,如果是自定义那需要加上包名作为前缀schemeURI中的scheme部分,必须至少设置一个scheme属性,否则其他的URI属性将无效hostURI中的host部分,必须为小写字母,该属性需要设置了scheme属性才有效portURI中的port,该属性需要设置了scheme和hos

10、t属性才有效 以上为AndroidManifest配置文件中一些常见的标记和属性等的说明介绍,具体的用法会在下节讲解对应组件的时候运用。3.2 Activity与基本通信3.2.1 Activity 与 ViewActivity是最常见的组件,每个Activity都相当于一个屏幕,为用户提供进行交互的可视界面,一个应用程序可以包含一个或者多个Activity,Activity一般都继承自android.app包下的Activity类。Activity的生命周期。 生命周期包括四个阶段:1. 活动状态:Activity处于可视状态可以获得焦点。2. 暂停状态:Activity可见但是不能获得焦点

11、。3. 停止状态:Activity处于不可见状态。4. 销毁状态:Activity结束,或Activity所在的Dalvik进程被结束。从图中可以看出Activity生命周期中有七个方法会被系统回调。onCreate :创建Activity时被调用。onStart :启动Activity时被调用。onRestart:重启Activity时候被调用。onResume:恢复Activity时被调用。onPause:暂停Activity时被调用。onStop:停止Activity时被调用。OnDestroy:销毁Activity时被调用。测试上述七个生命周期的调用实例:1. 创建一个TestActi

12、vity的项目。2. 打开自动生成的java源文件,覆盖Activity当中的七个生命周期方法。 在每个方法当中写上相应的打印语句作为提示,代码当中添加了个Button,并对Button实现了监听,按下按钮退出。如上代码,xml文件参照前面章节内容。3. 为看运行结果,需要在DDMS当中添加一个打印语句的过滤器,查看输出的结果。如下图,当程序启动时打印了前三句,启动后按键盘上的Home键,打印接下来的pause和stop,再重新选择应用程序进入打印接下来的三句,按下退出按钮,退出程序打印最后三句。View是所有UI组件、容器组件的父类。Activity通过setContentView来显示指定

13、的组件。第二章当中讲解了部分View的直接或间接子类。在后续章节当中还会详细的来介绍。3.2.2 Intent 与 IntentFilter Intent类的对象有两种用途,一种是用来启动系统的组件,这些组件包括有Activity、Service、BroadcastReceiver,另外Intent类对象还可以作为组件间通信的载体。 首先来看看Intent启动不同组件所要使用的方法。见下表。组件方法ActivitystartActivity(Intent intent)startActivityForResult(Intent intent, int requestCode)Servicest

14、artService(Intent service)bindService(Intent service, ServiceConnection conn, int flags)BroadcastReceiversendBroadcast(Intent intent)sendBroadcast(Intent intent, String receiverPermission)sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler schedul

15、er, int initialCode, String initialData, Bundle initialExtras) sendOrderedBroadcast(Intent intent, String receiverPermission)sendStickyBroadcast(Intent intent)sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle in

16、itialExtras)通过上表了解了启动相应组件的方法。接下来就来看看Intent对象的属性。Intent对象属性有六个部分。1.Component Name 部分组件名称指明了要处理的Intent的组件,组件名称封装在一个ComponentName对象中,该对象用于惟一标识一个应用程序组件,如Activity、Service、Content Provider等。ComponentName类包含两个String成员,分别代表组件的全称类名和包名,包名必须和AndroidManifest.xml中标记中的对应信息一致。对于Intent对象来说,组件名称是不必须的,如果添加了组件名称则该Inte

17、nt为“显示Intent”,这样Intent在传递的时候会直接根据ComponentName对象的信息去寻找目标组件。如果不设置组件名称,则为“Intent”,Android会根据Intent中的其他信息来确定响应该Intent的组件是哪个。2. Action 部分 Action为一个字符串对象,其描述了该Intent会触发的动作。Android系统中已经预先定义好了一些表征Action的常量,如ACTION_CALL、ACTION_MAIN等,同时,开发人员也可以自己定义Intent的动作描述,一般是一个带包名的完整类名表示形式。Action很大程度上决定了一个Intent的内容,所以定义自

18、己的Action时应该做到见名知意,同时如果应用程序比较复杂,应该为其定义一个整体的Action协议,使所有的Action集中管理。系统当中启动Activity的标准Action如下。Action对应字符串描述说明ACTION_MAINent.action.MAIN应用程序入口ACTION_VIEWent.action.VIEW显示指定数据ACTION_ATTACH_DATAent.action. ATTACH_DATA指定某块数据将被附加到其它地方ACTION_EDITent.action. EDIT编辑

19、指定数据ACTION_PICKent.action. PICK从列表中选择某项并返回所选的数据ACTION_CHOOSERent.action. CHOOSER显示一个Activity选择器ACTION_GET_CONTENTent.action. GET_CONTENT让用户选择数据,并返回所选数据ACTION_DIALent.action. DIAL显示拨号面板ACTION_CALLent.action. CALL直接向指定用户拨号ACTION_SENDent

20、.action. SEND发送数据ACTION_SENDTOent.action. SENDTO发送消息ACTION_ANSWERent.action. ANSWER应答电话ACTION_INSERTent.action. INSERT插入数据ACTION_DELETEent.action. DELETE删除数据ACTION_RUNent.action. RUN运行数据ACTION_SYNCent.action. SYNC执行数据同步ACTION_PICK_ACT

21、IVITYent.action. PICK_ACTIVITY用于选择ActivityACTION_SEARCHent.action. SEARCH执行搜索ACTION_WEB_SEARCHent.action. WEB_SEARCH执行Web搜索ACTION_FACTORY_TESTent.action. FACTORY_TEST工厂测试的入口点3. Data 部分 Data描述Intent的动作所操作到的数据的URI及类型,不同的Action对应不同的操作数据,比如Action为ACTION_VIEW的I

22、ntent的Data应该是“http:”格式的URI。当为组件进行Intent的匹配检查时,正确设置Data的URI资源和数据类型很重要。4. Category 部分 Category为字符串对象,其包含了可以处理Intent的组件的类别信息,Intent中可以包含任意个一样Category。同Action,Android系统预先定义了一些Category常量,但是不可以自行定义Category。调用方法addCategory用来为Intent添加一个Category,发放removeCategory用来移除一个Category;getCategory方法返回已定义的Category。标准的C

23、ategory 常量及对应的字符串如下表。Category对应字符串描述说明CATEGORY_DEFAULTent.category.DEFAULT默认CATEGORY_BROWSABLEent.category. BROWSABLE指定该Acitivity能被浏览器安全调用CATEGORY_TABent.category. TAB指定Activity为TabActivity的Tab页CATEGORY_LAUNCHERent.category. LAUNCHERActivity显示顶级程序列表中CATEGO

24、RY_INFOent.category. INFO用于提供包信息CATEGORY_HOMEent.category. HOME设置该Activity随系统启动而运行CATEGORY_PREFERENCEent.category. PREFERENCE该Activity是参数面板CATEGORY_TESTent.category. TEST该Activity是一个测试CATEGORY_CAR_DOCKent.category. CAR_DOCK指定手机被插入汽车底座时运行该Activit

25、yCATEGORY_DESK_DOCKent.category. DESK_DOCK指定手机被插入桌面底座时运行该ActivityCATEGORY_CAR_MODEent.category. CAR_MODE设置该Activity可以在车载环境下使用5. Extras 部分 Extras是一组键值对,其包含需要传递给目标组件并由其处理的一些额外信息。6. Flags 部分 一些有关系系统如何启动组件的标志位,所有的标志位都已在Android系统中预先定义。 通过实例来了了解如何使用Intent对象来启动Activity对象。启动Service等其他组

26、件启动会在后续章节中介绍。 实例Intent & Activity。1. 创建一个名为TestIntent的项目。2. 创建一个继承Activity的名为TestActivity2类。并在AndroidManifest文件中声明该Activity类。3. 打开main.xml文件,添加一个切换到下一页的Button。4. 生成一个新的second.xml布局文件,并添加内容如下。5. 在自动生成的Activity类当中添加如下代码。6. 在TestActivity2类当中添加修改代码如下。7. 运行起来点击切换按钮。就能切换到下一个页面。上述例子当中的5步骤也可以讲按键监听的代码替换为注释的代

27、码段,进入一个发送信息的页面。 3.2.3 Handler与Bundle Android应用程序运行时,系统会为第一个启动的组件创建一个进程。之后启动的组件都运行在该进程中。进程创建的同时一个主线程将会被创建,如果应用程序中再创建了其他线程,那么线程与主线程之间的通讯我们就可以用到Handler。 Handler类主要用于应用程序的内部通信。每个Handler对象都与一个线程及其消息队列相关联,当创建一个Handler对象时,它就会与创建Handler对象的线程的消息队列绑定。Handler对象可以向消息队列传递message或者runnable。所以Handler最主的操作就是Message

28、和Runnable对象。 Message对象中有几个主要的字段比如arg1,arg2,obj,what等,简单的Message数据可以直接使用这些字段。如果数据内容较多,Message当中有getData和setData方法来设置Message的内容。这两个方法的返回和接收对象都是Bundle对象。 Bundle对象是以String为键,以恩义可以封装的类型为值的map。 有了Bundle对象就可以使用Handler来sendMessage。下面通过实例介绍。 实例Handler和Bundle对象。1. 创建一个名为TestHandler的项目。2. 打开main.xml文件,添加启动Hand

29、ler对象的按钮,并且为TextView对象添加id,同时添加一个ProgressBar对象来接受Handler将要更新的数据。ProgressBar对象的使用与第二章介绍的界面组件用法相同。ProgressBar设置为横向的类型,并且设置为不可视状态。如下。3. 在Activity类实现代码如下。 上述的代码当中,根据id先获取到对应button、progressBar和textView对象。按下按钮设置progressBar为可视状态,textView显示启HandlerHandler对象,Handler对象将runnable对象加入到消息队列。 通过上述实例,可以看到Handler用于程

30、序的内部通信,而通信的内容可以用Bundle对象作为数据载体。3.3 Android应用基本组件 Android的应用程序四大基本组件是Activity、BroadcastReceiver、Service以及ContentProvider。Activity已在上小节中详细介绍到。本小节就来介绍其余的组件。3.3.1 BroadcastReceiver BroadcastReceiver是程序用于接收广播消息并对消息做出相应处理的组件。比如系统会在电池电量过低的情况下发出广播进行通知,如果应用程序需要该广播消息,就可以注册对应的BroadcastReceiver类,即继承该类,在接收到广播后做相

31、应需要的操作。在前面的小节当中已经介绍过BroadcastReceiver的发布广播方法了。那么下面主要通过实例来了解如何注册BroadcastReceiver并且接收广播发布的信息。 第一种注册方法是在AndroidManifest文件当中注册。1. 写一个类继承BroadcastReceiver类,并实现它的onReceive方法。方法当中写上打印语句测试。如下代码。2. 在AndroidManifest文件中注册,如下代码17-23行,为receiver加上,以方便过滤所需要的广播信息。3. 在main.xml文件中添加一个Button,在Activity类当中实现按键监听,按下按钮即发

32、出一个相对应监听的广播信息。4. 按按钮发送广播信息后,得到如下测试的打印语句。注意的是,如果使用这种注册方法,那么在应用程序关闭的时候也依然收到广播,也就是一直处于活动的状态,有的时候会造成浪费。第二种注册方法是在代码当中来注册。该实例当中注册接收短信接收的广播信息。 1.首先创建一个继承BroadcastReceiver的类。2.在main.xml文件当中添加两个Button,button为注册监听,button2为移除监听。如下代码,13行中定义了一个SMS_ACTION常量,作为广播信息的过滤信息。3.在AndroidManifest文件中添加对应的permission。第7行。4.在

33、第一步生成的类中实现onReceive方法,在该方法当中将得到的广播Intent对象进行信息获取,得到Bundle对象并将信息取出打印。5.运行起来,点击注册广播监听按钮。6.在DDMS当中的如下图部分,输入号码与信息内容点击send发送信息。7.运行的打印测试语句显示如下图。8.点击移除广播监听按钮,再重复5步骤查看运行结果。3.3.2 ContentProvider ContentProvider也是Android应用的四大组件之一,与Activity、Service、BroadcastReceiver相似,需要在AndroidManifest文件中进行声明与配置。ContentProvi

34、der是不同应用程序之间进行数据交换的标准API。ContentProvider以Uri的形式对外提供数据,允许其他应用访问或者修改数据,其它应用程序使用ContentResolver根据Uri去访问操作指定数据。 使用ContentProvider必须先了解Uri。Android中的Uri分为三个部分。如content:/ject.myprovider/words,第一部分就是content:/部分,这个部分是Android规定的固定,类似URL的协议部分只要通过HTTP协议来访问网站那么都是用http/: 开头。 第二个部分就是ject.myprovider,这个部分是ContentProvider的authority。系统由该部分来决定操作哪一个ContentProvider。words是数据部分也就是访问声明资源。words后面可再添加路径,表示id号,再添加就是表示字段。Uri类当中提供了parse()静态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论