新書推薦:
《
图解机械工程入门
》
售價:NT$
440.0
《
股市长线法宝(第6版)
》
售價:NT$
640.0
《
中文版SOLIDWORKS 2024机械设计从入门到精通(实战案例版)
》
售價:NT$
450.0
《
纯数学教程
》
售價:NT$
390.0
《
威尔士史:历史与身份的演进
》
售價:NT$
490.0
《
黄金、石油和牛油果:16件商品中的拉丁美洲发展历程
》
售價:NT$
395.0
《
母亲的选择:看不见的移民保姆与女性工作
》
售價:NT$
340.0
《
城邦政治与灵魂政治——柏拉图《理想国》中的政治哲学研究
》
售價:NT$
590.0
|
編輯推薦: |
1. 对Android应用程序开发的基本概念和技术进行系统讲解,并通过简单易懂的示例说明其具体实现过程。2. 通过本书的学习,读者可以牢固掌握Android编程技术的基本概念、原理和编程方法,通过实践的灵活运用,能够进行应用程序的实际开发。3. 分为三个部分,共10章。*部分即第1章,详细介绍Android系统的体系结构、应用程序开发环境及调试环境的搭建;第二部分包括第2~4章,详细介绍用户界面的设计方法、常用布局、基本控件和高级控件、事件处理机制等实现Android用户界面的基本知识,以及用户浏览模式中菜单模式和动作条模式中各种应用的具体实现;第三部分包括第5~10章,详细介绍Android平台的高级知识,包括发送与接收消息、多任务与服务、实现应用程序的数据存储、访问数据资源的接口ContentProvider、触摸事件处理、定位服务和Google地图应用。4. 适合对Java编程有一定基础、希望掌握Android程序设计技术的读者,也适合作为高等学校计算机专业的教材,还可作为Android程序设计的培训教材。
|
內容簡介: |
本书对Android应用程序开发的基本概念和技术进行了系统的讲解,并通过简单易懂的示例说明了其具体实现过程。通过本书的学习,读者可以牢固掌握Android编程技术的基本概念、原理和编程方法,通过实践的灵活运用,能够进行应用程序的实际开发。 全书分为三个部分,共10章。*部分即第1章,详细介绍Android系统的体系结构、应用程序开发环境及调试环境的搭建;第二部分包括第2~4章,详细介绍用户界面的设计方法、常用布局、基本控件和高级控件、事件处理机制等实现Android用户界面的基本知识,以及用户浏览模式中菜单模式和动作条模式中各种应用的具体实现;第三部分包括第5~10章,详细介绍Android平台的高级知识,包括发送与接收消息、多任务与服务、实现应用程序的数据存储、访问数据资源的接口ContentProvider、触摸事件处理、定位服务和Google地图应用。 本书适合对Java编程有一定基础、希望掌握Android程序设计技术的读者,也适合作为高等学校计算机专业的教材,还可作为Android程序设计的培训教材。
|
目錄:
|
目录
第1章Android开发基础1
1.1Android入门1
1.1.1Android简介1
1.1.2Android技术架构2
1.2Android Studio环境搭建4
1.2.1基于Windows的安装5
1.2.2基于Mac的安装6
1.2.3基于Linux的安装6
1.3第一个Android应用程序7
1.3.1创建Android项目7
1.3.2在手机上运行HelloWorld App11
1.3.3在AVD上运行HelloWorld App14
1.3.4定义简单的用户界面16
1.3.5启动另一个Activity18
1.4使用Android Studio23
1.4.1Android Project的目录结构23
1.4.2AndroidManifest.xml分析25
1.5Android App开发起步28
1.5.1App开发流程28
1.5.2Android关键组件30
1.6本章小结30
第2章设计应用界面31
2.1理解Activity31
2.1.1创建可运行的Activity31
2.1.2Activity的生命周期37
2.1.3任务和回退栈42
2.2理解布局43
2.2.1线性布局LinearLayout45
2.2.2相对布局RelativeLayout49〖1〗基于Android平台的移动互联网应用开发(第2版)目录[3]〖3〗2.2.3表格布局TableLayout52
2.3使用布局54
2.4样式和主题57
2.4.1定义样式58
2.4.2使用样式59
2.5理解资源60
2.5.1提供资源61
2.5.2访问资源62
2.6多屏幕适应63
2.7本章小结64
第3章Fragment和图形控件66
3.1理解Fragment66
3.1.1Fragment的概念66
3.1.2创建和使用Fragment69
3.1.3创建动态UI74
3.2常用基本控件79
3.2.1事件处理机制80
3.2.2按钮控件81
3.2.3Toast控件88
3.2.4文本控件90
3.2.5ImageView控件96
3.2.6ProgressBar控件98
3.3界面效果处理100
3.3.1文本处理100
3.3.2定义链接101
3.3.3文本样式101
3.3.4切换绘图105
3.3.5叠加绘图107
3.3.6切换颜色109
3.4本章小结110
第4章菜单和动作条111
4.1菜单模式111
4.1.1菜单资源112
4.1.2菜单类型114
4.1.3菜单分组125
4.1.4设置Intent127
4.2动作条模式128
4.2.1添加Action Item130
4.2.2添加Actiion View134
4.2.3添加Action Provider136
4.2.4使用系统定义的Action Provider137
4.2.5自定义动作提供器139
4.2.6添加Navigation Tab140
4.2.7应用导航模式143
4.3本章小结147
第5章发送和接收消息148
5.1理解Intent148
5.1.1Intent的概念148
5.1.2Intent对象的组成149
5.1.3Intent解析153
5.1.4使用Intent实现数据传递159
5.2BroadcastReceiver组件168
5.2.1BroadcastReceiver的概念168
5.2.2静态注册方式169
5.2.3动态注册方式172
5.3Notification管理175
5.3.1创建Notification176
5.3.2导航设计181
5.3.3定义样式185
5.4本章小结186
第6章多任务与服务188
6.1基本概念188
6.1.1进程188
6.1.2线程190
6.2实现多任务191
6.2.1多任务实现原理191
6.2.2用Handler实现多任务194
6.2.3AsyncTask实现多任务197
6.3理解服务200
6.3.1服务的生命周期201
6.3.2创建启动类型服务205
6.3.3创建绑定类型服务211
6.4本章小结219
第7章实现数据的存储220
7.1本地数据存储220
7.2Preference的存取与设置220
7.2.1存取Shared Preferences221
7.2.2理解Preference框架223
7.3文件读取与保存229
7.3.1内部存储229
7.3.2扩展存储233
7.3.3文件资源235
7.4存取结构化数据237
7.4.1SQLite简介237
7.4.2创建SQLite数据库239
7.4.3管理外键约束242
7.4.4查询和更新SQLite数据库243
7.4.5管理游标Cursor247
7.5本章小结248
第8章内容提供者249
8.1ContentProvider基础249
8.1.1什么是ContentProvider249
8.1.2访问提供器ContentResolver250
8.1.3内容统一资源标识251
8.1.4MIME类型252
8.2使用ContentProvider253
8.2.1获取数据253
8.2.2修改数据257
8.2.3预定义的ContentProvider263
8.3创建ContentProvider263
8.3.1设计过程264
8.3.2设计实例273
8.4实现数据加载281
8.4.1基本原理281
8.4.2ListView控件284
8.5本章小结287
第9章触摸事件处理289
9.1理解触摸事件289
9.2事件传递机制292
9.2.1内外层次之间292
9.2.2同一层次之间300
9.3速率跟踪301
9.4多点触控303
9.5手势识别305
9.5.1发现手势306
9.5.2缩放手势处理308
9.6拖放处理311
9.6.1拖放操作311
9.6.2设计拖动操作314
9.6.3实现拖动操作318
9.7本章小结325
第10章定位服务与Google地图327
10.1定位服务327
10.1.1获取位置信息327
10.1.2定位最佳策略330
10.1.3调试位置数据334
10.1.4实现位置信息获取334
10.2Google地图337
10.2.1API中的重要类338
10.2.2使用Google Maps API339
10.3本章小结351
附录AEclipse的Android App开发环境352
A.1Android开发环境搭建352
A.1.1安装Eclispe开发环境352
A.1.2安装Android SDK353
A.1.3安装Eclipse ADT插件354
A.1.4安装Google Play services SDK355
A.2第一个Android应用程序356
A.2.1创建AVD356
A.2.2创建一个新的Android项目357
A.2.3创建用户界面359
A.2.4运行应用程序359
A.2.5使用XML 来定义用户界面361
A.3Android项目结构分析365
参考文献368
|
內容試閱:
|
关于本书随着3G和触摸屏的技术发展,移动智能终端,即智能手机和平板电脑,已经成为人们日常通信和信息处理的工具,移动互联网正在改变人们的交流和生活方式。作为移动智能终端两大操作系统之一,Android的影响力已经渗透到移动领域以外,特别是物联网和电视等平台,Android应用程序也由个人应用逐步向企业应用扩展。掌握Android技术的人才就业前景非常广泛。我们编写本书主要有两个目的:全面系统地提供Android开发的基础知识,基于Android Studio开发环境提供编程示例。在本书的编写中把Android的基础知识,与自己的教学经验和学习的体会结合起来,希望能够引导Andorid技术学习者快速入门,系统地掌握Android编程技术。由于目前Android技术更新很快,本书内容中的概念和原理主要参考Android的官方网站,尽量做到既准确又易于理解,代码示例均通过实际调试,可运行。本书主要围绕 Android 技术,讲述如何利用 Android 相关技术,开发移动终端的互联网应用程序。全书共分为10章。第1章概述使用Android技术在移动终端开发的基础知识,包括Android的基本常识和技术框架,并介绍如何搭建Android开发环境Android Studio和Android应用程序项目的结构。第2章主要介绍Android的四大基础组件之一Activity、布局和资源的概念,介绍如何使用Android的Activity和布局管理器来设计移动终端的用户图形界面。第3章主要介绍三部分内容。首先介绍Fragment的概念,Fragment的生命周期以及使用Fragment静态创建和动态创建用户界面的具体步骤和代码;第二部分主要介绍Android用户界面的事件处理机制,图形界面中的常用视图控件如何使用及如何进行事件处理,其中包括按钮控件中的 Button、RadioButton、Checkbox和ToggleButton,Toast控件,以及文本控件中的TextView和EditText;最后使用例子说明了如何对界面进行处理,使其显示效果多样化。〖1〗基于Android平台的移动互联网应用开发(第2版)前言[3]〖3〗第4章主要介绍了Android应用程序的浏览模式。从Android 3.0开始,Android系统的应用浏览模式发生了较大的改变,引入了向上和返回的设计原则,并且提供了相应的设计组件,其中包含菜单和动作条等。本章主要介绍菜单模式和动作条模式的实现。第5章主要介绍Android系统的应用程序之间发送和接收消息的机制。介绍Android实现发送和接收消息的Intent、BroadcastReceiver组件和Notification组件的概念、用途和实现方法。第6章主要介绍Android系统的多任务机制、主线程的概念和实现多任务的原理,以及在Androd系统中如何使用handler或AsyncTask实现应用程序的多任务。在多任务的基础上,本章的另一部分介绍Android的四大组件之一Service的概念和基本知识,以及在应用程序中实现Service的两种方式。第7章主要介绍Android系统实现应用程序数据存储的机制,包括用户偏好的存取、文件的读取与保存和SQLite数据库的创建与操作。第8章主要介绍Android的四大组件之一ContentProvider的概念和相关知识,以及如何创建和使用ContentProvider,如何通过数据绑定,使用适配器、视图对象和SQLite数据库的ContentProvider实现数据加载,最终向用户显示数据。第9章主要介绍Android有关触摸屏的应用程序开发。包括触摸事件的定义、触摸事件的传递机制、触摸点移动的速率跟踪、多点触控、手势识别和拖放处理等。第10章有两个部分。第一部分主要介绍Android应用程序如何通过GPS和Android网络位置提供器,获取位置信息,实现定位服务;第二部分主要介绍Android应用程序如何使用Google公司提供的Google Maps API,实现应用程序中的Goolge地图的功能。本书基本囊括了Android技术体系中的基础部分,并使用短小易懂的例子详细说明了如何应用。本书的不足之处在于,由于时间和篇幅的原因,本书只是编写了Android技术中最基础的部分,Android技术中关于网络互联、动画、游戏、服务器和其他更深层次的应用等都没有涉及,不能全面覆盖Android技术,还请读者谅解。并且,由于水平的原因,在本书的编写过程中可能存在一些对 Android技术及移动互联网技术介绍不全面或者表述疏漏的地方,敬请读者批评指正。读者对象本书是Android技术入门的基础类书籍,通过本书的学习读者可以牢固掌握Android编程技术的基本概念、原理和编程方法,能够进行应用程序的实际开发。本书适合对Java编程有一定基础、希望掌握Android程序设计技术的读者,也适合作为高等学校计算机专业的教材,还可作为Android程序设计者的培训教材。致谢在本书的写作过程中,得到了很多人士的悉心帮助,在此谨向给予本书帮助的诸位及本书所参考的官方网站和网站社区表示诚挚的感谢。特别感谢对外经济贸易大学信息学院和远程学院,为本书的教学和实践提供了支持平台。特别感谢美国内华达大学拉斯维加斯分校(UNLV)的Yingtao Jiang教授和他的实验室,给予了本书很大的帮助和支持,并提出了中肯的意见。特别感谢清华大学出版社的编辑们,他们为这本书的再版做了很多辛苦工作。
编者2017年5月
第5章发送和接收消息5.1理解Intent什么是Intent呢?Intent是连接Android组件的纽带,专门用于携带需要传递的信息。当某个组件创建一个Intent对象并发送后,Android系统会根据这个Intent携带的信息激活对应的其他组件,也就是启动这些组件,执行这些组件的代码。这个Intent对象中同时携带触发其他组件执行的条件信息和触发后该组件执行时所需要的信息。5.1.1Intent的概念由于Android是一个基于有限资源的操作系统,Android的基本设计理念是鼓励减少组件的耦合,因此Android提供了Intent机制一种通用的消息系统。Android的一个应用程序与其他的应用程序之间通过传递Intent对象来执行动作和产生事件。通过Intent的消息触发、消息传递、消息响应来实现窗口跳转、传递数据或调用外部程序,进行应用程序的激活和调用。Android的基础组件Activity、Service和BroadcastReceiver,都可以通过定义Intent的消息,实现在各组件之间的程序跳转和数据传递,也就是Intent的消息可以激活其他组件。从程序的角度来看,在Android中,Intent相当于各个Activity之间或其他类型基础组件的桥梁,可以传递数据,还可以通过Intent启动另外一个基础组件。例如,从一个窗口单击一个链接,用浏览器打开另一个页面时,既要启动浏览器程序,又要把链接传递给浏览器,这时Android应用程序就可以在第一个Activity中创建一个Intent对象,在Intent对象把链接的数据封装,然后通过Android系统传递给浏览器程序,并启动浏览器。抽象地说,Intent消息是同一个应用程序或不同应用程序运行后,组件间进行绑定的一种能力。通过Intent消息,把不同的组件与用户的操作联系起来,例如在一个Activity上单击一个按钮就打开另一个显示照片的Activity,而单击链接则打开一个浏览器。具体来说,Intent对象包含要执行的操作或需要传递的消息,或者在广播的情况下,包含一些已经发生或正在发生的事情的描述。举个例子,在一个联系人维护的应用中,当我们在一个联系人列表屏幕假设对应的Activity为listActivity上,单击某个联系人后,希望能够跳出此联系人的详细信息屏幕假设对应的Activity为detailActivity,在两个Activity之间,需要传递联系人的信息,这个工作由Intent完成。5.1.2Intent对象的组成一个Intent对象就是一个信息包。它包含了接收这个Intent对象的组件所感兴趣的信息(如要执行的动作和动作相关的数据)和Android系统感兴趣的信息(如处理这个Intent对象的组件的分类和有关如何启动目标Activity的指令)。Intent为这些不同的信息定义了对应的属性,我们通过设定所需的属性值,就可以把数据从一个Activity传递到另一个Activity。〖1〗基于Android平台的移动互联网应用开发(第2版)第5章发送和接收消息[3]〖3〗Intent对象可绑定的信息如下: ComponentName: 需要启动的Activity的名字。 Action: 指定了要访问的Activity需要做什么。 Data: 需要传递的数据。 Category: 给出一些Action的额外执行信息。 Extras: 需要传递的额外信息,以键值对形式传递。 Flags: 标记Activity启动的方式。但是Intent对象在绑定信息时,并不是所有的信息都必须设置,而只是选定需要携带的信息绑定到Intent对象,也就是设定Intent对象的对应属性的值。1. ComponentNameIntent的组件名称对象由ComponentName类封装。也就是说,Intent定义了一个属性描述Intent将要激活或启动的Android组件名称,这个组件可以是一个Activity、Service、BroadcastReceiver或者ContentProvider。Intent的这个属性值是一个ComponentName类的对象,我们无法直接访问它,但可以通过getComponentName获取。ComponentName类包含两个String成员,分别代表Android组件的全称类名和包名,包名必须和AndroidManifest.xml文件中标记中的对应信息一致。也就是说,这个Intent对象所要激活或启动的Android组件,已经在AndroidManifest.xml中进行了描述。对于Intent,组件名并不是必需的。如果一个Intent对象添加了组件名,则称该Intent为显式Intent,这样的Intent在传递时会直接根据组件名去寻找目标组件。如果没有添加组件名,则称为隐式Intent,Android会根据Intent中的其他信息来确定响应该Intent的组件。打个比方,老师在让学生回答问题时,老师说: 张三请回答问题,这就是显式Intent,直接指出了回答问题的人;老师说: 请第二排第三个同学回答问题,这就是隐式Intent,给出了回答问题学生的条件,学生根据自己的座位来确认是谁来回答问题。2. ActionAction是描述要求Android系统所执行动作的一个属性,值是一个字符串常量,代表Android组件所可能执行的一些操作,如启动Activity、发出警告等。Android系统中已经预定义了一些Action常量,开发者也可以定义自己的Action描述。Android定义了一套标准Action的值,其中最重要的和最常用的Action操作是ACTION_MAIN和ACTION_EDIT,见表5.1。表5.1标准的Action操作标准的Activity Actions标准的Broadcast ActionsACTION_MAINACTION_VIEWACTION_ATTACH_DATAACTION_EDITACTION_PICKACTION_CHOOSERACTION_GET_CONTENTACTION_DIALACTION_CALLACTION_SENDACTION_SENDTOACTION_ANSWERACTION_INSERTACTION_DELETEACTION_RUNACTION_SYNCACTION_PICK_ACTIVITYACTION_SEARCHACTION_WEB_SEARCHACTION_FACTORY_TESTACTION_TIME_TICKACTION_TIME_CHANGEDACTION_TIMEZONE_CHANGEDACTION_BOOT_COMPLETEDACTION_PACKAGE_ADDEDACTION_PACKAGE_CHANGEDACTION_PACKAGE_REMOVEDACTION_PACKAGE_RESTARTEDACTION_PACKAGE_DATA_CLEAREDACTION_UID_REMOVEDACTION_BATTERY_CHANGEDACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTEDACTION_SHUTDOWN假如这个属性定义了ACTION_MAIN动作,则表示接收Intent对象传递信息的Activity进行初始化和启动操作,并且不需要数据输入也没有返回值输出。假如这个属性定义了ACTION_BATTERY_LOW动作,当电池电量低时,系统会使用Intent对象传递这个信息给BroadcastReceiver组件。下面是Action和后面携带相关数据的例子:ACTION_VIEW content:contactspeople1--显示标识为"1"的联系人信息ACTION_DIAL content:contactspeople1--显示可填写的电话拨号器ACTION_DIAL tel:123--显示带有号码的拨号器ACTION_EDIT content:contactspeople1--编辑标识为"1"的联系人信息ACTION_VIEW content:contactspeople--显示联系人列表在Java中使用setAction来设置Intent的Action属性,使用getAction来获得Action属性。3. DataData部分描述了Android系统执行与Action相关的动作时所激活的其他组件执行时需要的数据、数据MIME类型和URI,不同的Action对应不同的操作数据。例如,如果动作字段是ACTION_EDIT,数据字段将包含将显示用于编辑的文档的URI;如果动作是ACTION_CALL,数据字段将是一个tel:URI和将拨打的号码;如果动作是ACTION_VIEW,数据字段是一个http:URI,接收活动将被调用去下载和显示URI指向的数据。当Android系统根据一个Intent匹配对应的组件时,通常知道数据的类型(它的MIME类型)和它的URI很重要。例如,一个能够显示图像数据的组件,就不应该在播放一个音频文件时被激活。在许多情况下,能够从URI中推测数据类型,特别是content:URIs,它表示位于设备上的数据且被ContentProvider控制。但是也能够显示地设置类型,使用Intent的setData方法指定数据的URI、setType指定MIME类型,setDataAndType指定数据的URI和MIME类型。被激活执行的Activity中,获取Intent对象后,通过Intent的getData读取URI、getType读取类型。Data部分的数据类型是由Action的值决定的,下面给出的几个例子可以看出,Action部分的不同,决定了数据部分的值不同。ACTION_VIEW content:contacts1--显示标识符为"1"的联系人的详细信息ACTION_EDIT content:contacts1--编辑标识符为"1"的联系人的详细信息ACTION_VIEW content:contacts--显示所有联系人的列表ACTION_PICK content:contacts--显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父Activity4. CategoryCategory主要描述被请求组件或执行行为动作的额外信息。Android系统也为类别定义了一系列的静态常量字符串来表示Intent的不同类别,其中标准的类别定义见表5.2。表5.2标准的Category和ExtrasStandard CategoryStandard Extra DataCATEGORY_DEFAULTCATEGORY_BROWSABLECATEGORY_TABCATEGORY_ALTERNATIVECATEGORY_SELECTED_ALTERNATIVECATEGORY_LAUNCHERCATEGORY_INFOCATEGORY_HOMECATEGORY_PREFERENCECATEGORY_TESTCATEGORY_CAR_DOCKEXTRA_ALARM_COUNTEXTRA_BCCEXTRA_CCEXTRA_CHANGED_COMPONENT_NAMEEXTRA_DATA_REMOVEDEXTRA_DOCK_STATEEXTRA_DOCK_STATE_HE_DESKEXTRA_DOCK_STATE_LE_DESKEXTRA_DOCK_STATE_CAREXTRA_DOCK_STATE_DESKEXTRA_DOCK_STATE_UNDOCKED续表Standard CategoryStandard Extra DataCATEGORY_DESK_DOCKCATEGORY_LE_DESK_DOCKCATEGORY_HE_DESK_DOCKCATEGORY_CAR_MODECATEGORY_APP_MARKETEXTRA_DONT_KILL_APPEXTRA_EMAILEXTRA_INITIAL_INTENTSEXTRA_INTENTEXTRA_KEY_EVENTEXTRA_ORIGINATING_URIEXTRA_PHONE_NUMBEREXTRA_REFERREREXTRA_REMOTE_INTENT_TOKENEXTRA_REPLACINGEXTRA_SHORTCUT_ICONEXTRA_SHORTCUT_ICON_RESOURCEEXTRA_SHORTCUT_INTENTEXTRA_STREAMEXTRA_SHORTCUT_NAMEEXTRA_SUBJECTEXTRA_TEMPLATEEXTRA_TEXTEXTRA_TITLEEXTRA_UID5. Extras主要描述组件的扩展信息或额外的数据。Android也定义了标准的Extra Data常量,见表5.2。Extras采用键值对的结构,以Bundle对象的形式保存在Intent当中。附加信息其实是一个类型安全的容器,其实现就是将HashMap做了一层封装。Intent对象有一系列的put方法用于插入各种附加数据和一系列的get方法用于读取数据。这些方法与Bundle对象的方法类似。实际上,Extras可以作为一个Bundle,使用putExtras和getExtras方法安装和读取。例如,如果要执行发送电子邮件这个动作,可以将电子邮件的标题、正文等保存在Extras里,传给电子邮件发送组件。6. FlagsFlags主要标示如何触发目标组件以及如何看待被触发的目标组件。例如标示被触发的组件应该属于哪一个任务或者触发的组件是否是最近的Activity等。Flags可以是多个标示符的组合。Android有各种各样的标志,指示Android系统如何去启动一个Activity(例如,Activity应该属于那个任务)和启动之后如何对待它(例如,它是否属于最近的活动列表)。所有这些标志都定义在Intent类中。其可用的常量包括FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_NO_HISTORY、FLAG_ACTIVITY_SINGLE_TOP。5.1.3Intent解析当一个Activity创建并发出一个Intent对象后,其他的Activity或基础组件可能因为与这个Intent对象携带的信息相关而被启动。一个Activity或其他基础组件实现在各组件之间的程序跳转和数据传递,可以通过Intent的两种不同方式来实现: 显式和隐式。1 显式Intent: 指在Activity或其他组件创建Intent对象时,通过Component Name显式地设定所希望启动、激活或接收这个Intent对象的目标组件(如Service)名称,当这个Activity发送这个Intent对象后,由Android系统自动启动或激活Component Name指定的Android组件,接收这个Intent对象携带的其他信息。因为有时开发者不知道其他应用的Component名称,显式方式常用于自己应用内部的消息传递,比如应用中一个Activity启动一个相关的Service或者启动一个相关的Activity。2 隐式Intent: 创建Intent对象的组件,并不指定目标组件的名字,即Component Name字段为空,当这个Activity发送这个Intent对象后,Android系统通过Intent对象中的其他信息与目标组件的Intent过滤器中的设置相匹配,来启动或激活相关的Activity、Service或BroadcastReceiver等目标组件。隐式Intent经常用于激活其他应用程序中的组件。对于接收隐式的Intent的Android组件来说,需要在AndroidManifest.xml中设定接收Intent对象的策略。当Android系统在处理Intent对象时,把Intent对象中携带的信息与应用程序中组件设定的Intent过滤策略逐个相比较,判断该组件是否符合启动或接收的条件。也就是说,通过设定Intent过滤策略条件,可以指示Android系统在什么时候启动并把Intent对象传递给自己。下面是一个使用Intent Filter的例子。这是在AndroidManifest.xml文件中IntentExampleActivity的声明代码。当系统中其他的Activity发送出一个Intent对象,并且这个Intent对象的Action属性的值为MY_ACTION时,Android系统会启动IntentExampleActivity应用程序。如果一个组件没有声明任何Intent过滤器,它仅能接收显式的Intent,也就是被显式Intent对象启动或激活;而声明了Intent过滤器的组件可以接收显式和隐式的Intent。并非Intent对象中所有的信息都会用于过滤器的匹配,只有Action、Data(包括URI和数据类型)、Category三个字段才被考虑。下面具体讨论一下Intent过滤器及其检测方法。1. Intent过滤器Intent过滤器是由intentfilter标记来设置的。Activity、Service、BroadcastReceiver为了告知Android系统能够处理哪些隐式Intent,可以设置一个或多个条件,说明该组件可接收的Intent对象,过滤掉不想接收的隐式Intent对象。除了BroadcastReceiver通过调用Context.registerReceiver动态地注册,直接创建一个Intent Filter对象外,其他的Intent过滤器必须在AndroidManifest.xml文件中进行声明。可用于Intent过滤器的Intent字段有三个: Action、Data和Category。在Android系统通过组件的Intent过滤器检测隐式Intent时,要检测所有这三个字段,其中任何一个字段匹配失败,系统都不会把这个隐式Intent给该组件。但每个字段可以用intentfilter设置多个条件,每个设定的条件之间相互独立,只要其他组件发送出的隐式Intent对象符合其中的一个条件,就能够被Android系统启动或接收。2. Action检测在AndroidManifest.xml文件中,对Action字段设置过滤条件,在元素下使用子元素及其属性android:name来设置可接收的Action字段的值。例如:根据例子设置的过滤策略,只要Action字段的值符合上面列出之一的Intent,都可以被这个组件接收。虽然一个Intent对象的Action只有一个值,但是一个过滤器可以列出不止一个,接收多种类型Action的Intent对象。值得注意的是,元素下必须至少包含一个子元素,否则它将阻塞所有的intents。要通过检测,Intent对象中指定的动作必须匹配Intent过滤器的Action列表中的一个。如果过滤器没有子元素,将没有一个Intent匹配,所有的Intent都会检测失败,没有Intent能够通过过滤器。3. Category检测类似Action检测,在元素下使用子元素及其属性android:name列出可接收的Category字段的值。例如:在Intent对象中可以含有多个Category,中可以设置多个,只有Intent中的所有Category都能匹配到中的,Intent才能通过检测。也就是说,如果Intent对象中的Category集合是中的集合的子集时,Intent对象才能通过检查。如果Intent对象中没有设置Category的值,则它能通过所有的检查。如果一个Intent能够通过不止一个组件的,系统可能会询问哪个组件被激活。如果找不到目标组件,会产生一个异常。4. Data检测类似的,在元素下使用元素及其属性可接收的Data字段的值。例如:每个元素可以指定一个URI和数据类型(MIME类型)。对应于URI的scheme、host、port、path四个部分,元素分别使用属性android:scheme、android:host、android:port、android:path来设置。下面是URI的格式和一个例子。scheme:host:portpathcontent:com.example.project:200foldersubfolderetcscheme是content,host是"com.example.project",port是200,path是"foldersubfolderetc"。host和port一起构成URI的凭据(authority),如果host没有指定,port也被忽略。这四个属性都是可选的,但它们之间并不都是完全独立的。要让authority有意义,scheme必须也要指定。要让path有意义,scheme和authority也都必须要指定。当比较Intent对象和过滤器的URI时,仅仅比较过滤器中出现的URI属性。例如,如果一个过滤器仅指定了scheme,所有有此scheme的URI都匹配过滤器;如果一个过滤器指定了scheme和authority,但没有指定path,所有匹配scheme和authority的URI都通过检测,而不管它们的path;如果四个属性都指定了,要都匹配才能算是匹配。然而,过滤器中的path可以包含通配符来要求匹配path中的一部分。元素的mimeType属性指定数据的MIME类型。Intent对象和过滤器都可以用""通配符匹配子类型字段,例如"text","audio"表示任何子类型。在Data检测时,系统既要检测URI,也要检测MIME类型。检测的规则如下:1 一个Intent对象既不包含URI,也不包含MIME类型: 仅当过滤器也不指定任何URI和MIME类型时,才不能通过检测;否则都能通过。2 一个Intent对象包含URI,但不包含MIME类型: 仅当过滤器也不指定MIME类型,同时它们的URI匹配,才能通过检测。例如,mailto:和tel:都不指定实际数据。3 一个Intent对象包含MIME类型,但不包含URI: 仅当过滤器也只包含MIME类型且与Intent相同,才通过检测。4 一个Intent对象既包含URI,也包含MIME类型(或MIME类型能够从URI推断出): MIME类型部分,只有与过滤器中之一匹配才算通过;URI部分,它的URI要出现在过滤器中,或者它有content:或file: URI,又或者过滤器没有指定URI。换句话说,如果它的过滤器仅列出了数据类型,组件假定支持content:和file:。如果一个Intent能够通过不止一个组件的,系统可能会询问哪个组件被激活。如果找不到目标组件,会产生一个异常。例如,Android一个名为Note Pad的应用程序,允许用户浏览便签,查看每条便签的内容。这个程序在Manifest文件中可以按代码5.1来设置Intent过滤器,使其可以根据需要被系统激活。代码5.1应用程序的Intent过滤器设置
在代码5.1中,可知此应用程序定义了三个Activity,每一个Activity都定义了多个Intent模板。其中命名为com.android.notepad.NotesList的第一个Activity作为进入应用程序的主入口,通过定义三个Intent过滤器,可以做三件事情。第一个Intent过滤模板代码如下:
|
|