fbpx

[email protected]

购物车

 查看订单

  • 我的帐户
东东购 | EasternEast
  • 中文书店
    • 畅销排行榜
      • 小说 畅销榜
      • 童书 畅销榜
      • 外语畅销榜
      • 管理畅销榜
      • 法律畅销榜
      • 青春文学畅销榜
    • 热门分类
      • 社会小说
      • 成功/励志 畅销榜
      • 人物传记
      • 大陆原创
      • 绘本童书
      • 影视小说
    • 文学推荐
      • 文集
      • 戏剧
      • 纪实文学
      • 名家作品
      • 民间文学
      • 中国现当代随笔
    • 新书热卖榜
      • 小说 新书热卖榜
      • 青春文学 新书热卖榜
      • 童书 新书热卖榜
      • 管理 新书热卖榜
      • 成功/励志 新书热卖榜
      • 艺术 新书热卖榜
  • 精选分类
    • 小说
    • 保健养生
    • 烹饪/美食
    • 风水/占卜
    • 青春文学
    • 童书
    • 管理
    • 成功/励志
    • 文学
    • 哲学/宗教
    • 传记
    • 投资理财
    • 亲子家教
    • 动漫/幽默
    • 法律 Legal
    • 经济 Economics
    • 所有分类
  • 关于东东
  • 帮我找书
搜索
首页计算机/网络移动开发Android软件开发教程(第2版)

Android软件开发教程(第2版)

配套资源丰富,每个知识点都配有短小精悍的示例程序,既能帮助读者理解知识,又具有启发性和实用性

作者:张雪梅、李志强、王向 出版社:清华大学出版社 出版时间:2018年06月 

ISBN: 9787302488675
年中特卖用“SALE15”折扣卷全场书籍85折!可与三本88折,六本78折的优惠叠加计算!全球包邮!
trust badge

EUR €41.99

类别: 研究生/本科/专科教材, 移动开发 SKU:5d8403975f9849104540270a 库存: 有现货
  • 描述
  • 评论( 0 )

描述

开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302488675丛书名: 深入浅出系列规划教材

编辑推荐
本书所有程序均采用时新的Android Studio 2.3.3(API Level 26)开发环境调试。本书特别设置了Java语言和XML的基础知识介绍,帮助没有Java和XML基础的读者学习Android软件开发。每个知识点都配有短小精悍的示例程序,既能帮助读者理解知识,又具有启发性和实用性,非常适合教学讲授、自学或作为工具资料查询。每一章都配有难度适中的练习题,引导读者巩固和扩展所学知识。本书提供配套教学课件PPT、例题和习题源代码等,均可从清华大学出版社网站下载。 
内容简介
本书是面向Android初学者的教程,书中介绍了设计开发Android系统应用程序的基础理论和实践方法。全书共12章,内容涵盖Java语言与面向对象编程基础、XML基础、开发环境搭建、Android应用程序的基本组成、事件处理机制和常用Widget组件、Fragment、异步线程与消息处理、基于Intent的Activity切换及数据传递、Service、BroadcastReceiver、数据存取机制、多媒体应用、网络应用等。本书注重理论与实践相结合,采用Android Studio 2.3.3开发环境,配有丰富的示例程序,讲解深入浅出,可以使读者在较短的时间内理解Android系统框架及其应用的开发过程,掌握Android应用程序的设计方法。本书提供所有程序的源代码和电子课件。
本书可作为普通高等学校计算机、通信、电子信息类本专科及各类培训机构Android软件开发课程的教材,也可作为Android程序设计爱好者的自学用书。
目  录

目录

第1章Android软件开发起步1

1.1智能移动设备及其操作系统1

1.2Android系统的体系结构3

1.2.1Android系统简介3

1.2.2Android系统的总体架构3

1.2.3Android SDK简介5

1.3Java语言与面向对象编程基础7

1.3.1配置Java开发环境7

1.3.2Java程序的开发过程8

1.3.3Java程序的结构10

1.3.4Java的数据类型和运算符12

1.3.5Java的流程控制语句14

1.3.6数组16

1.3.7泛型18

1.3.8面向对象的编程方法19

1.3.9异常处理23

1.4XML基础23

1.4.1XML简介23

1.4.2XML的用途26

1.4.3XML文档的结构26

1.4.4XML语法27

1.4.5XML命名空间31

1.5编写规范的Android代码33

1.6本章小结34

习题34

第2章创建个Android应用程序37

2.1搭建Android应用程序开发环境37

2.1.1Android Studio简介37

2.1.2Android Studio的安装38

2.1.3创建和启动Android虚拟设备41

2.1.4Android Studio的更新与设置44

2.2创建个Android应用程序51

2.2.1创建Android工程项目51

2.2.2编译和运行Android应用程序54

2.3Android Studio工程项目的文件构成56

2.3.1java文件夹56

2.3.2res文件夹58

2.3.3应用程序配置文件AndroidManifest.xml60

2.3.4Gradle文件62

2.4开发Android应用软件的一般流程64

2.4.1开发Android应用软件的一般流程64

2.4.2APK文件的签名和打包66

2.5程序调试的常用方法和调试工具68

2.5.1使用Android Studio的调试器68

2.5.2图形化调试工具DDMS70

2.5.3查看工程项目在运行过程中的日志信息71

2.6本章小结73

习题73

〖1〗〖2〗Android软件开发教程(第2版)〖1〗目录〖2〗第3章Activity的界面布局74

3.1Activity及其生命周期74

3.1.1Android应用的基本组件74

3.1.2什么是Activity75

3.1.3Activity的生命周期76

3.1.4Activity的启动模式80

3.1.5Context及其在Activity中的应用83

3.2布局文件及其加载83

3.2.1View类和ViewGroup类84

3.2.2XML布局及其加载85

3.2.3在Activity中定义和引用布局86

3.2.4资源的管理与使用87

3.3界面元素的常用属性93

3.3.1控件ID及其使用93

3.3.2布局尺寸参数及其使用94

3.3.3XML常用布局控件的标签及属性95

3.4常用的布局96

3.4.1线性布局LinearLayout96

3.4.2布局AbsoluteLayout99

3.4.3相对布局RelativeLayout100

3.4.4表格布局TableLayout102

3.4.5帧布局FrameLayout104

3.5本章小结107

习题107

第4章常用界面控件及其应用108

4.1Widget控件概述108

4.2Android的事件处理机制108

4.2.1基于监听接口的事件处理方式109

4.2.2基于回调机制的事件处理113

4.2.3直接绑定到XML标签的事件处理方法116

4.3文本的输入和输出118

4.3.1TextView118

4.3.2EditText119

4.3.3AutoCompleteTextView122

4.3.4Toast124

4.4单选按钮和复选框126

4.4.1RadioButton和RadioGroup126

4.4.2CheckBox129

4.5列表131

4.6下拉列表选择框138

4.7本章小结140

习题140

第5章对话框、菜单和状态栏消息142

5.1对话框142

5.1.1提示对话框AlterDialog143

5.1.2进度条对话框ProcessDialog149

5.1.3日期和时间选择对话框151

5.2菜单155

5.2.1使用XML资源定义菜单项156

5.2.2创建菜单157

5.2.3响应和处理菜单项的点击160

5.2.4上下文菜单161

5.3状态栏消息Notification163

5.4本章小结168

习题168

第6章Fragment及其应用169

6.1Fragment的基本概念169

6.1.1Fragment简介169

6.1.2Fragment的生命周期170

6.2创建和载入Fragment176

6.2.1创建Fragment176

6.2.2将Fragment加载到Activity中177

6.3利用Fragment实现界面的切换181

6.4利用Fragment实现侧滑菜单184

6.4.1主视图的布局184

6.4.2侧滑菜单的布局和菜单事件的响应185

6.4.3使用Android Studio提供的模板实现侧滑菜单189

6.5利用Fragment实现Tabbed
Activity192

6.6本章小结193

习题193

第7章线程与消息处理195

7.1基本概念195

7.1.1进程与线程195

7.1.2创建线程197

7.1.3操作线程199

7.1.4线程的状态和生命周期200

7.2Android的UI线程与非UI线程201

7.2.1单线程和多线程201

7.2.2非UI线程访问UI对象202

7.3Android多线程通信机制204

7.3.1线程间通信的常用类204

7.3.2使用Handler实现线程间通信207

7.3.3使用AsyncTask实现线程间通信213

7.4本章小结217

习题217

第8章Service与BroadcastReceiver218

8.1Android组件间的通信218

8.1.1Intent218

8.1.2Activity之间的切换和跳转222

8.2Service及其生命周期232

8.2.1Service简介232

8.2.2Service的生命周期233

8.3创建、启动和停止Service234

8.3.1创建Service234

8.3.2启动和停止Service236

8.3.3Activity与Service的通信239

8.3.4将Service绑定到Activity241

8.4Android的广播机制246

8.4.1广播的发送和接收246

8.4.2静态注册BroadcastReceiver247

8.4.3动态注册BroadcastReceiver250

8.4.4有序广播的发送和接收252

8.5本章小结255

习题255

第9章数据的存储与访问256

9.1基于SharedPreferences的数据存取256

9.2数据文件的存取260

9.2.1读取assets和raw文件夹中的文件260

9.2.2对内部文件的存取操作261

9.2.3对外部文件的存取操作266

9.3SQLite及其数据管理机制272

9.3.1SQLite概述272

9.3.2SQLiteOpenHelper、SQLiteDatabase和Cursor类273

9.3.3创建数据库和数据表274

9.3.4操纵数据库中的数据277

9.4基于ContentProvider的数据存取285

9.4.1ContentProvider285

9.4.2定义和使用ContentProvider285

9.5本章小结289

习题290

第10章多媒体应用开发291

10.1音视频文件的播放291

10.1.1MediaPlayer类291

10.1.2使用MediaPlayer播放音频文件294

10.1.3使用MediaPlayer播放视频文件297

10.1.4利用系统内置的播放器程序播放音频和视频299

10.1.5使用VideoView播放视频302

10.2音视频文件的录制305

10.2.1MediaRecorder类305

10.2.2使用MediaRecorder录制音视频306

10.3基于Camera类的图片摄取310

10.3.1Camera类310

10.3.2利用Camera类实现图片的摄取311

10.3.3利用系统内置的Camera应用实现图片的摄取317

10.4本章小结318

习题318

第11章Web应用开发320

11.1Android网络通信概述320

11.2网络资源的访问322

11.2.1使用HTTP的GET方式访问网络322

11.2.2使用HTTP的POST方式访问网络324

11.2.3使用HttpURLConnection访问网络326

11.2.4使用Socket进行网络通信330

11.3WebView333

11.3.1WebView的基本用法334

11.3.2WebView的参数设置334

11.3.3WebView应用实例338

11.4本章小结340

习题341

第12章综合应用实例342

12.1计算器APP342

12.1.1功能分析342

12.1.2界面布局设计342

12.1.3实现运算的类346

12.1.4界面功能的实现350

12.1.5实现基于SharedPreferences的数据存取353

12.1.6菜单设计354

12.2待办事项提醒小助手358

12.2.1功能分析358

12.2.2创建数据库359

12.2.3界面设计和功能实现360

12.2.4定时推送状态栏提醒377

12.2.5菜单设计379

12.3本章小结382

习题382

参考文献384

前  言
丛书序为什么开发深入浅出系列丛书?目的是从读者角度写书,开发出高质量的、适合阅读的图书。“不积跬步,无以至千里;不积小流,无以成江海。”知识的学习是一个逐渐积累的过程,只有坚持系统地学习知识,深入浅出,坚持不懈,持之以恒,才能把一类技术学习好。坚持的动力源于所学内容的趣味性和讲法的新颖性。计算机课程的学习也有一条隐含的主线,那就是“提出问题→分析问题→建立数学模型→建立计算模型→通过各种平台和工具得到终正确的结果”,培养计算机专业学生的核心能力是“面向问题求解的能力”。由于目前大学计算机本科生培养计划的特点,以及受教学计划和课程设置的原因,计算机科学与技术专业的本科生很难精通掌握一门程序设计语言或者相关课程。各门课程设置比较孤立,培养的学生综合运用各方面的知识能力方面有欠缺。传统的教学模式以传授知识为主要目的,能力培养没有得到充分的重视。很多教材受教学模式的影响,在编写过程中,偏重概念讲解比较多,而忽略了能力培养。为了突出内容的案例性、解惑性、可读性、自学性,本套书努力在以下方面做好工作。1. 案例性所举案例突出与本课程的关系,并且能恰当反映当前知识点。例如,在计算机专业中,很多高校都开设了高等数学、线性代数、概率论,不言而喻,这些课程对于计算机专业的学生来说是非常重要的,但就目前对不少高校而言,这些课程都是由数学系的老师讲授,教材也是由数学系的老师编写,由于学科背景不同和看待问题的角度不同,在这些教材中基本都是纯数学方面的案例,作为计算机系的学生来说,学习这样的教材缺少原动力并且比较乏味,究其原因,很多学生不清楚这些课程与计算机专业的关系是什么。基于此,在编写这方面的教材时,可以把计算机上的案例加入其中,例如,可以把计算机图形学中的三维空间物体图像在屏幕上的伸缩变换、平移变换和旋转变换在矩阵运算中进行举例,可以把双机热备份的案例融入马尔可夫链的讲解,可以把密码学的案例融入大数分解中,等等。2. 解惑性很多教材中的知识讲解注重定义的介绍,而忽略因果性、解释性介绍,往往造成知其然而不知其所以然。下面列举两个例子。(1) 读者可能对OSI参考模型与TCP/IP参考模型的概念产生混淆,因为两种模型之间有很多相似之处。其实,OSI参考模型是在其协议开发之前设计出来的,也就是说,它不是针对某个协议族设计的,因而更具有通用性。而TCP/IP模型是在TCP/IP协议栈出现后出现的,也就是说,TCP/IP模型是针对TCP/IP协议栈的,并且与TCP/IP协议栈非常吻合。但是必须注意,TCP/IP模型描述其他协议栈并不合适,因为它具有很强的针对性。说到这里读者可能更迷惑了,既然OSI参考模型没有在数据通信中占有主导地位,那为什么还花费这么大的篇幅来描述它呢?其实,虽然OSI参考模型在协议实现方面存在很多不足,但是,OSI参考模型在计算机网络的发展过程中起到了非常重要的作用,并且,它对未来计算机网络的标准化、规范化的发展有很重要的指导意义。〖1〗〖2〗Android软件开发教程(第2版)〖1〗丛书序〖2〗(2) 再例如,在介绍原码、反码和补码时,往往只给出其定义和举例表示,而对后为什么在计算机中采取补码表示数值?浮点数在计算机中是如何表示的?字节类型、短整型、整型、长整型、浮点数的范围是如何确定的?下面我们来回答这些问题(以8位数为例),原码不能直接运算,并且0的原码有 0和-0两种形式,即00000000和10000000,这样肯定是不行的,如果根据原码计算设计相应的门电路,由于要判断符号位,设计的复杂度会大大增加,不合算;为了解决原码不能直接运算的缺点,人们提出了反码的概念,但是0的反码还是有 0和-0两种形式,即00000000和11111111,这样是不行的,因为计算机在计算过程中,不能判断遇到0是 0还是-0;而补码解决了0表示的性问题,即不会存在 0和-0,因为 0是00000000,它的补码是00000000,-0是10000000,它的反码是11111111,再加1就得到其补码是100000000,舍去溢出量就是00000000。知道了计算机中数用补码表示和0的性问题后,就可以确定数据类型表示的取值范围了,仍以字节类型为例,一个字节共8位,有00000000~11111111共256种结果,由于1位表示符号位,7位表示数据位,正数的补码好说,其范围从00000000~011111111,即0~127;负数的补码为10000000~11111111,其中,11111111为-1的补码,10000001为-127的补码,那么到底10000000表示什么合适呢?8位二进制数中,小数的补码形式为10000000;它的数值值应该是各位取反再加1,即为01111111 1=10000000=128,又因为是负数,所以是-128,即其取值范围是-128~127。3. 可读性图书的内容要深入浅出,使人爱看、易懂。一本书要做到可读性好,必须做到“善用比喻,实例为王”。什么是深入浅出?就是把复杂的事物简单地描述明白。把简单事情复杂化的是哲学家,而把复杂的问题简单化的是科学家。编写教材时要以科学家的眼光去编写,把难懂的定义,要通过图形或者举例进行解释,这样能达到事半功倍的效果。例如,在数据库中,范式、第二范式、第三范式、BC范式的概念非常抽象,很难理解,但是,如果以一个教务系统中的学生表、课程表、教师表之间的关系为例进行讲解,从而引出范式的概念,学生会比较容易接受。再例如,在生物学中,如果纯粹地讲解各个器官的功能会比较乏味,但是如果提出一个问题,如人的体温为什么是37℃?以此为引子引出各个器官的功能效果要好得多。再例如,在讲解数据结构课程时,由于定义多,表示抽象,这样达不到很好的教学效果,可以考虑在讲解数据结构及其操作时用程序给予实现,让学生看到直接的操作结果,如压栈和出栈操作,可以把PUSH()和POP()操作实现,这样效果会好很多,并且会激发学生的学习兴趣。4. 自学性一本书如果适合自学学习,对其语言要求比较高。写作风格不能枯燥无味,让人看一眼就拒人千里之外,而应该是风趣、幽默,重要知识点多举实际应用的案例,说明它们在实际生活中的应用,应该有画龙点睛的说明和知识背景介绍,对其应用需要注意哪些问题等都要有提示。一书在手,从页开始的起点到后一页的终点,如何使读者能快乐地阅读下去并获得知识?这是非常重要的问题。在数学上,两点之间的短距离是直线。但在知识的传播中,使读者感到“阻力小”的书才是好书。如同自然界中没有直流的河流一样,河水在重力的作用下一定沿着阻力小的路径向前进。知识的传播与此相同,有效的传播方式是传播起来损耗小,阅读起来没有阻力。欢迎联系清华大学出版社白立军老师投稿: [email protected]。
2014年12月15日前言随着移动互联网时代的来临,智能手机及其客户端APP软件成为广大用户接入和使用互联网的主要设备和方式之一。由谷歌公司推出的Android系统自2007年问世以来,得到了全球众多厂商和运营商的支持,迅速成为智能手机的主流操作系统,占据了大部分的市场份额。它不仅得到了全球开发者社区的极大关注,而且一大批世界一流的手机生产厂商和运营厂商都已经采用了Android系统,因此基于Android的手机APP软件开发日益受到广大开发者的关注,一些大学和培训机构也相继开设了基于Android的软件技术培训课程。这不仅合乎时代发展需要,而且有助于学生日后的就业,更能满足国内外日益增长的专业需求。本书是在作者撰写的《深入浅出Android软件开发教程》(第1版)的基础上,听取了部分任课教师和教材使用者的修改意见,结合Android智能手机软件开发的发展,重新撰写的一部教材。作为一本面向初学者的教程,本书延续上一版的写作风格,注重讲解的深入浅出和易学易懂,对于一些较难理解的理论,尽可能使用图示加以说明。对每个知识点都配有示例程序,并力求示例程序短小精悍,既能帮助读者理解知识,又具有启发性和实用性,非常适合教学讲授、自学或日后作为工具资料查询。每一章都配有难度适中的习题,引导读者编写相关功能的实用程序,有助于提高读者的学习兴趣。本书特别设置了Java语言和XML的基础知识介绍,同时这部分内容还可以作为Java和XML语法简明手册使用,便于初学者在编程过程中查阅。由于Android程序设计涉及编程语言、网络通信、硬件控制、多媒体等较多知识内容,所以学习时应该遵循循序渐进、由浅入深的原则。学习的过程中既要注重理论的理解,更要加强动手实践,尤其对于初学者,多练习才能掌握设计的方法和技巧。本书的示例程序采用2017年6月发布的Android Studio 2.3.3开发环境调试,其安装文件版本为androidstudiobundle162.4069837windows.exe,模拟器版本为Android 8.0(API 26)。Android Studio自2013年推出以来,在几次更新之后已经成为非常稳定和强大的IDE开发环境。和基于Eclipse的编程环境相比,Android Studio具有很多优势。Android Studio以IntelliJ IDEA为基础,整合了Gradle构建工具,为开发者提供了开发和调试工具,包括智能代码编辑、用户界面设计工具、性能分析工具等。Android Studio的界面风格更受程序员欢迎,代码的修改会自动智能保存,自带了多设备的实时预览,具有内置命令行终端,具有更完善的插件系统(如Git、Markdown、Gradle等)和版本控制系统,在代码智能提示、运行响应速度等方面都更出色。本书共分12章。第1章介绍智能移动设备及其操作系统,Android系统的体系结构,以及Java、XML等Android程序设计必要的预备知识。第2章介绍在Windows系统中搭建Android开发平台的主要步骤和集成开发环境的使用方法,并且通过学习创建个Android应用程序,了解典型Android应用程序的架构与组成。第3~5章介绍用户界面的设计,主要包括XML布局文件的设计和使用方法、常见的界面布局方式、Android中的事件处理机制、常用的用户界面控件以及对话框、菜单和状态栏消息的设计方法。第6章介绍Fragment的基本概念、Fragment的加载和切换以及相关应用。第7章介绍线程的概念、相关操作和Android多线程通信机制。第8章介绍Intent的概念及其在组件通信中的应用,包括Activity之间的跳转与通信、后台服务Service及其启动/停止方法、广播消息的发送和接收等。第9章介绍Android常用的数据存储和访问方法,包括Shared Preferences、文件存取、SQLite数据库存储、内容提供器(Content Provider)等。第10章介绍在Android系统中如何处理和使用音视频等多媒体资源。第11章主要介绍访问Internet资源的方法,包括利用Http、HttpURLConnection或Socket与远程服务器交互,使用WebView控件在Activity中包含一个基于WebKit浏览器的方法等。第12章介绍两个综合应用实例的设计思路和实现方法,以加深对基本知识的理解。本书第1~6章由张雪梅编写,第7、8章由李志强编写、第9~12章由王向编写,部分章节中的实例由李志强、王向完成,后由高凯完成了全书的统稿和审阅工作。本书可作为大学相关专业教科书和工程实训、技能培训用书,也可供工程技术人员参考。本书提供源代码下载和教学课件下载,相关源代码和课件资源均在清华大学出版社网站(http: //www.tup.com.cn)发布,方便读者自学和实践。在本书的写作与相关科研课题的研究工作中,得到了多方面的支持与帮助。在写作过程中,有关Android智能手机软件开发的相关网站亦为本书提供了良好的基础,我们也参考了相关文献和互联网上众多热心网友提供的素材,本书的顺利完成也得益于参阅了大量的相关工作及研究成果,在此谨向这些文献的作者、热心网友以及为本书提供帮助的老师致以诚挚的谢意和崇高的敬意。在本书的写作过程中,也得到了清华大学出版社的大力支持和帮助,在此一并表示衷心感谢。本书读者对象包括计算机、通信、电子信息类本专科学生,以及从事手机软件开发与维护的工程技术人员。由于作者水平有限,书中难免有不足之处,恳请广大读者批评指正。作者的联系方式是[email protected],欢迎来信交流,共同探讨Android程序设计方面的问题。
作者2018年5月
在线试读
第3章Activity的界面布局Activity是Android应用程序主要的展示窗口。本章首先介绍Android应用的组成和有关Activity的基础知识;然后介绍基于XML文件完成Activity布局的方法、在Activity中通过Java编程方式设定布局的方法,以及Android的资源管理与使用方法;后介绍常用的布局方式,内容涉及相对布局、线性布局、布局、表格布局、帧布局等。3.1Activity及其生命周期〖*8/9〗3.1.1Android应用的基本组件一般来说,Android应用程序由Activity、ContentProvider、Service、BroadcastReceiver等组成。当然,有些应用程序可能只包含其中的一部分而非全部。它们在AndroidManifest.xml配置文件中以不同的XML标签声明后,才可以在应用程序中使用。Activity一般含有一组用于构建用户界面UI的Widget控件,如按钮Button、文本框EditText、列表ListView等,实现与用户的交互,相当于Windows应用程序的对话框窗口或网络应用程序的Web页面窗口。一个功能完善的Android应用程序一般由多个Activity构成,这些Activity之间可互相跳转,可进行页面间的数据传递。例如显示一个Email通讯簿列表的界面就是一个Activity,而编辑通讯簿的界面则是另一个Activity。ContentProvider是Android系统提供的一种标准的数据共享机制。在Android平台下,一个应用程序使用的数据存储都是私有的,其他应用程序是不能访问和使用的。私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库。当需要共享数据时,ContentProvider提供了应用程序之间数据交换的机制。一个应用程序通过实现一个ContentProvider的抽象接口将自己的数据暴露出去,并且隐蔽了具体的数据存储实现,这样既实现了应用程序内部数据的保密性,又能够让其他应用程序使用这些私有数据。一个ContentProvider提供了一组标准的接口,能够让应用程序保存或读取各种数据,同时实现了权限机制,保护了数据交互的安全性。Service是与Activity独立且可以保持后台运行的服务,相当于一个在后台运行的没有界面的Activity。如果应用程序并不需要显示交互界面但却需要长时间运行,就需要使用Service。例如在后台运行的音乐播放器,为了避免音乐播放器在后台运行时被终止而停播,需要为其添加Service,通过调用Context.startService()方法,让音乐播放器一直在后台运行,直到使用者再调出音乐播放器界面并关掉它为止。用户可以通过StartService()方法启动一个Service,也可通过Context.bindService()方法来绑定一个Service并启动它。在Android中,广播是一种广泛运用在应用程序之间传输信息的机制。而BroadcastReceiver是用来接收并响应广播消息的组件,不包含任何用户界面。可以通过启动Activity或者Notification通知用户接收到重要信息。Notification能够通过多种方法提示用户,包括闪动背景灯、振动设备、发出声音或在状态栏上放置一个持久的图标。Activity、Service和BroadcastReceiver都是由Intent异步消息激活的。Intent用于连接以上各个组件,并在其间传递消息。例如,广播机制一般通过下述过程实现: 首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent对象以广播方式发送出去。Android使用intentfilter来处理对这种广播信息的接收。当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的intentfilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法,对其接收并响应。例如对于一个电话程序,当有来电时,电话程序就自动使用BroadcastReceiver取得对方的来电消息并显示。使用Intent还可以方便地实现各个Activity间的跳转和参数传递。〖1〗〖2〗Android软件开发教程(第2版)〖1〗第3章Activity的界面布局〖2〗3.1.2什么是ActivityActivity是Android四大组件中基本的组件,是Android应用程序中常用也是重要的部分。在应用程序中,用户界面主要通过Activity呈现,包括显示控件、监听并处理用户的界面事件并做出响应。Activity在界面上的表现形式有全屏窗体、非全屏悬浮窗体、对话框等。在模拟器上运行应用程序时,可以按Home键或回退键退出当前Activity。对于大多数与用户交互的程序来说,Activity是必不可少的,也是非常重要的。刚开始接触Android应用程序时,可以暂且将Activity简单地理解为用户界面。新建一个Android项目时,系统默认生成一个启动的主Activity,其默认的类名为MainActivity,源码文件中的主要内容如代码段31所示。代码段3-1MainActivity源代码import android.app.Activity;  //每一个Android的Activity都需要继承自Activity类import android.os.Bundle;   //用于映射字符串值public class MainActivity extends Activity {//MainActivity是类名称,其父类是Activity@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);    //设置布局,它调用了res/layout/activity_main.xml中定义的界面元素}}应用程序中的每个Activity都继承自android.app.Activity类并重写(Override)其OnCreate()方法。Activity通常要与布局资源文件(res/layout目录下的XML文件)相关联,并通过setContentView()方法将布局呈现出来,如代码段31所示。在Activity类中通常包含布局控件的显示、界面交互设计、事件的响应设计以及数据处理设计、导航设计等内容。一个Android应用程序可以包含一个或多个Activity,一般在程序启动后会首先呈现一个主Activity,用于提示用户程序已经正常启动并显示一个初始的用户界面。需要注意的是,应用程序中的所有Activity都必须在AndroidManifest.xml文件中添加相应的声明,并设置其属性和intentfilter。例如,代码段32含有对两个Activity(MainActivity和SecondActivity)的声明,代码中有两个元素,个是系统默认生成的MainActivity,第二个是用户新建的SecondActivity,其中的MainActivity是程序入口。代码段3-2AndroidManifest.xml文件中的声明3.1.3Activity的生命周期所有Android组件都具有自己的生命周期,生命周期是指从组件建立到组件销毁的整个过程。在生命周期中,组件会在可见、不可见、活动、非活动等状态中不断变化。Activity的生命周期指Activity从启动到销毁的过程。生命周期由系统控制,程序无法改变,但可以用onSaveInstanceState()方法保存其状态。了解Activity的生命周期有助于理解Activity的运行方式和编写正确的Activity代码。Activity在生命周期中表现为4种状态,分别是活动状态、暂停状态、停止状态和非活动状态。处于活动状态时,Activity在用户界面中位于上层,完全能被用户看到,能够与用户进行交互。处于暂停状态时,Activity在界面上被部分遮挡,该Activity不再位于用户界面的上层,且不能够与用户进行交互。处于停止状态时,Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡。非活动状态指不在以上3种状态中的Activity。参考Android SDK官网文档中的说明,Activity生命周期如图31所示。该示意图中涉及的方法被称为生命周期方法,当Activity状态发生改变时,相应的方法会被自动调用。图31Activity对象生命周期示意图android.app.Activity类是Android提供的基类,应用程序中的每个Activity都继承自该类,通过重写父类的生命周期方法来实现自己的功能。在代码段31中,@Override表示重写父类的onCreate()方法,Bundle类型的参数保存了应用程序上次关闭时的状态,并且可以通过一个Activity传递给下一个Activity。在Activity的生命周期中,只要离开了可见阶段(即失去了焦点),它就很可能被进程终止,这时就需要有一种机制能保存当时的状态,这就是其参数savedInstanceState的作用。有关Bundle的细节详见后续章节。(1) 启动Activity时,系统会先调用onCreate()方法,然后调用onStart()方法,后调用onResume()方法,Activity进入活动状态。(2) 当Activity被其他Activity部分覆盖或被锁屏时,Activity不能与用户交互,系统会调用onPause()方法,暂停当前Activity的执行,Activity进入暂停状态。(3) 当Activity由被覆盖状态回到前台或解除锁屏时,系统会调用onResume()方法,再次进入活动状态。(4) 当切换到新的Activity界面或按Home键回到主屏幕时,当前Activity完全不可见,转到后台。系统会先调用onPause()方法,然后调用onStop()方法,Activity进入停止状态。(5) 当Activity处于停止状态时,用户后退回到此Activity,系统会先调用onRestart()方法,然后调用onStart()方法,后调用onResume()方法,Activity再次进入运行状态。(6) 当Activity处于被覆盖状态或者后台不可见,即处于暂停状态或停止状态时,如果系统内存不足,就有可能杀死这个Activity。而后用户如果退回到这个Activity,则会再次调用onCreate()方法、onStart()方法、onResume()方法,使其进入活动状态。(7) 用户退出当前Activity时,系统先调用onPause()方法,然后调用onStop()方法,后调用onDestroy()方法,结束当前Activity。Activity生命周期可分为可视生命周期和活动生命周期,可视生命周期是Activity在界面上从可见到不可见的过程,开始于onStart(),结束于onStop()。活动生命周期是Activity在屏幕的上层,并能够与用户交互的阶段,开始于onResume(),结束于onPause()。在Activity的状态变换过程中onResume()和onPause()经常被调用,因此这两个方法中应使用简单、高效的代码。编程人员可以在Activity中定义当处于什么状态时做什么事情。例如,当次启动一个Activity时,会调用onCreate()方法;当Activity处于可见状态时,会调用onStart()方法;当Activity得到用户焦点时,会调用onResume()方法;当Activity没有被销毁,重新启动这个Activity就会调用onRestart()方法;当Activity被遮挡住的时候,会调用onPause()方法;当Activity处于不可见状态的时候,会调用onStop()方法;当Activity被销毁时,会调用onDestroy( )方法。【例31】示例工程Demo_03_ActivityLifeCycle用于验证Activity生命周期方法被调用的情况,其主要代码如代码段33所示。代码段3-3验证Activity生命周期方法的示例程序package edu.hebust.zxm.demo_03_activitylifecycle;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;
public class MainActivity extends Activity {private static final String TAG = “生命周期示例”;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, “– onCreate()被调用–“);}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, “– onStart()被调用–“);}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, “– onResume()被调用–“);}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, “– onPause()被调用–“);}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, “– onStop()被调用–“);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, “– onDestroy()被调用–“);}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, “– onRestart()被调用–“);}}运行这个Activity后,在LogCat窗口中能看到给出的提示信息,从中可看到Activity的生命周期是如何运行的。例如,启动这个Activity后LogCat窗口输出的提示信息如图32所示,onCreate()、onStart()和onResume()方法被依次调用;关闭这个Activity时,LogCat窗口输出的提示信息如图33所示,onPause()、onStop()和onDestroy()方法被依次调用。图32Activity启动时调用的生命周期方法图33Activity结束时调用的生命周期方法3.1.4Activity的启动模式主Activity在启动应用程序时就创建完毕,在其中可以显示XML布局信息、指定处理逻辑等。对于功能较复杂的应用程序,往往一个界面是不够用的,这就需要多个Activity来实现不同的用户界面。在Android系统中,所有的Activity由堆栈进行管理,Activity栈遵循“后进先出”的规则。如图34所示,当一个新的Activity被执行后,它将会被放置到堆栈的,并且变成当前活动的Activity,而先前的Activity原则上还是会存在于堆栈中,但它此时不会在前台。Android系统会自动记录从首个Activity到其他Activity的所有跳转记录并且自动将以前的Activity压入系统堆栈,用户可以通过编程的方式删除历史堆栈中的Activity实例。图34Activity堆栈示意图Activity的启动方式有4种,分别是standard、singleTop、singleTask、singleInstance。可根据实际需求为Activity设置对应的启动模式,从而避免创建大量重复的Activity等问题。设置Activity启动模式的方法是在AndroidManifest.xml里对应的标签中设置android: launchMode属性。【例32】示例工程Demo_03_ActivityLaunchMode演示了Activity不同启动模式的区别。首先,新建一个基于空白模板的应用程序。然后在XML布局中添加一个TextView并给默认的TextView增加ID号以便以后引用它;添加一个按钮,设置其显示内容、ID号等信息。之后,在侦听按钮单击事件中显示任务栈中的ID号和实例号。示例程序的主要代码如代码段34所示。代码段3-4Activity的启动模式private TextView tv;//定义显示文字的TextView实例对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置布局TextView tv= (TextView)findViewById(R.id.mytv);//通过ID号引用TextViewtv.setText(String.format(“任务堆栈中的ID号:  %d\n Activity实例ID:  %s\n”, getTaskId(), this.toString()));findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { //设置按钮单击事件@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this, MainActivity.class));//启动自身}});}之后,可以在工程的AndroidManifest.XML文件中设置Activity的启动模式,通过引用android: launchMode的不同参数,完成对不同Activity启动模式的设置,如图35所示。图35在AndroidManifest.XML中设置Activity的启动模式Standard是默认模式,若当前Activity名为ActivityA,单击按钮可再次跳转到ActivityA,则单击按钮便会启动一个新的ActivityA实例叠加在刚才的ActivityA之上;再次点击,又会启动一个新的ActivityA实例并放置在它之上。此时Activity是在同一个任务栈里,只不过是不同的实例而已,单击手机上的回退键会依照栈顺序依次退出。图36中给出了任务堆栈的ID号(图中显示319)。随着用户单击界面中的按钮,这个ID号是不变的,变化的是下方显示在@后的Activity实例号(图中显示3a200df)。如果单击手机的回退键,会根据堆栈“后进先出”的特性依次显示各个实例号,但任务栈的ID号是不变的,始终的。在图36中的表现形式是上面框中的数据维持不变,而下面框中的数据会发生变化。图36示例程序的运行结果在图35所示的其他3种启动模式中,SingleTop模式可以有多个实例,但是不允许多个相同Activity叠加在一起,如果Activity在堆栈顶时启动相同的Activity,则不会创建新的实例,表现在图36中是两个框中的数据都不会发生变化。SingleTask模式只有一个实例,在同一个应用程序中启动它时,若Activity不存在,则会在当前创建一个新的实例;若存在,则会把任务列表中在其之上的其他Activity取消并调用它的onNewIntent()方法。SingleInstance模式只有一个实例,不允许有别的Activity存在,也就是说,一个实例堆栈中只有一个Activity。3.1.5Context及其在Activity中的应用Context的中文解释是“上下文”或“环境”,在Android中应该理解为“场景”。例如,正在打电话时,场景就是用户所能看到的在手机里显示出来的拨号键盘,以及虽然看不到,但是却在系统后台运行的对应着拨号功能的处理程序。Context描述的是一个应用程序环境的上下文信息,是访问全局信息(如字符串资源、图片资源等)的接口。通过它可以获取应用程序的资源和类,也包括一些应用级别操作,如启动Activity、发送广播、接收Intent信息等。也就是说,如果需要访问全局信息,就要使用Context。在代码段35中,this指的是这个语句所在的Activity对象,同时也是这个Activity的Context。代码段3-5通过Context获取Activity上下文中的字符串信息public class MainActivity extends ActionBarActivity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);tv = new TextView(this);//得到当前Activity的上下文信息tv.setText(R.string.hello_world); //通过Context得到字符串资源setContentView(tv);}}Android系统中有很多Context对象,例如前述的Activity继承自Context,也就是说每一个Activity对应一个Context。Service也继承自Context,每一个Service也对应一个Context。常用的Context对象有两种,一种是Activity的Context,另一种是Application的Context。二者的生存周期不同。Activity的Context生命周期仅在Activity存在时,也就是说,如果Activity已经被系统回收了,那么对应的Context也就不存在了;而Application的Context生命周期却很长,只要应用程序运行着,这个Context就是存在的,所以要根据自己程序的需要使用合适的Context。3.2布局文件及其加载Activity主要用于呈现用户界面,包括显示UI控件、监听并处理用户的界面事件并做出响应等。3.2.1View类和ViewGroup类在一个Android应用程序中,用户界面一般由一组View和ViewGroup对象组成。View对象是继承自View基类的可视化控件对象,是Android平台上表示用户界面的基本单元,如TextView、Button、CheckBox等。View是所有可视化控件的基类,提供了控件绘制和事件处理的属性和基本方法,任何继承自View的子类都会拥有View类的属性及方法。表31给出了View类常用属性的说明。View及其子类的相关属性既可以在XML布局文件中进行设置,也可以通过成员方法在Java代码中动态设置。表31View类的部分常用属性XML属性在Java代码中对应的方法功能及使用说明android: backgroundsetBackgroundResource(int)设置背景颜色android: clickablesetClickable(boolean)设置是否响应点击事件android: visibilitysetVisibility(int)设置该View控件是否可见android: focusablesetFocusable(boolean)设置View控件是否能捕获焦点android: idsetId(int)设置该View控件标识符android: layout_widthsetWidth(int)设置宽度android: layout_heightsetHeight(int)设置高度android: textsetText(CharSequence)/setText(int)设置控件上显示的文字android: textSizesetTextSize(float)设置控件上显示文字的大小android: textColorsetTextColor(int)设置控件上显示文字的颜色ViewGroup类是View类的子类,与View类不同的是,它可以充当其他控件的容器。ViewGroup类作为一个基类为布局提供服务,其主要功能是装载和管理一组View和其他的ViewGroup,可以嵌套ViewGroup和View对象,其关系如图37所示,而它们共同组建的顶层视图可以由应用程序中的Activity调用setContentView()方法来显示。Android中的一些复杂控件如Gallery、GridView等都继承自ViewGroup。图37View与ViewGroup的关系View 是屏幕上的一个矩形区域,负责绘制和事件处理,它是所有布局和Widget控件的基类,其继承结构如图38所示。图38布局和Widget控件的继承结构3.2.2XML布局及其加载在Android应用程序中,常见的布局方式有线性布局(linear layout)、相对布局(relative layout)、布局(absolute layout)、表格布局(table layout)、帧布局(frame layout)等。这些布局都通过ViewGroup的子类实现。界面的布局可以在XML文件中进行设置,也可以通过Java代码设计实现。如果采用种方式,则需要在资源文件夹res\layout中定义相应的布局文件。这个XML布局文件由许多View对象嵌套组成。如果布局中有多个元素,那么顶层的根节点必须是ViewGroup对象;如果整个布局只有一个元素,那么顶层元素就是的元素,它可以是一个单一的Widget对象。代码段36就是一个自定义的布局文件mylayout.xml,在其中声明了布局的实例,该例采用线性布局,布局中包括一个TextView控件。代码段3-6自定义的XML布局文件定义了布局文件之后,需要在Activity中的onCreate()回调方法中通过调用setContentView()方法来加载这个布局,如代码段37所示。代码段3-7通过重写onCreate()方法加载用户界面的布局public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mylayout); //加载布局}}3.2.3在Activity中定义和引用布局除了上述直接调用已经设定好的XML布局外,还可以在Java代码中直接引用某种布局,此时就不需要在工程的res文件夹下存放XML布局文件了。在将Widget对象实例化并设置属性值后,通过调用addView()方法可将其添加到设定的布局。【例33】工程Demo_03_DefineLayoutInActivity演示在Java代码中定义并引用布局的方法。此例是通过在MainActivity中添加线性布局而非通过XML布局文件来设置布局的。通过循环语句定义了3个按钮,并通过addView()方法将其添加到布局中,如代码段38所示。代码段3-8在Activity中设定布局public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout myLayout = new LinearLayout(this);//通过上下文设定线性布局对象myLayout.setGravity(Gravity.CENTER_HORIZONTAL);myLayout.setOrientation(LinearLayout.VERTICAL);//垂直布局myLayout.setPadding(0,20,0,0); //设置左、上、右、下边距setContentView(myLayout);   //加载布局Button myBtn;   //定义按钮对象for (int i=1; i<4; i ){   //添加几个按钮myBtn = new Button(this);myBtn.setText(“按钮” i);myBtn.setTextSize(20); //设置字体大小myBtn.setHeight(35); //设置按钮的高度myLayout.addView(myBtn);//将Button对象添加到布局中myBtn.getLayoutParams().width=300; }}}示例程序的运行结果如图39所示。图39示例程序的运行结果3.2.4资源的管理与使用在Android中,对字符、颜色、图像、音视频等资源的使用与管理也是很方便的,只要调用或设置资源文件夹res下的相关媒体文件或XML文件,就可以实现相关功能。1.  R.java文件R.java文件由Android Studio自动生成与维护,提供了对Android资源的全局索引。Android应用程序中,XML布局和资源文件并不包含在Activity的Java源码中,各种资源文件由系统自动生成的R.java文件来管理。每一个资源类型在R.java文件中都有一个对应的内部类。例如,类型为layout的资源项在R.java文件中对应的内部类是layout,而类型为string的资源项在R.java文件中对应的内部类就是string。R.java文件的作用相当于一个项目字典,项目中的用户界面、字符串、图片、声音等资源都会在该类中创建其的ID,当项目中使用这些资源时,会通过该ID得到资源的引用。如果程序开发人员变更了任何资源文件的内容或属性,R.java文件会随之变动并自动更新R.java类。可以打开R.java文件查看其内容,如图310所示,但开发者不需要也不能修改此文件,否则资源的内存地址会发生错误,程序就无法运行了。图310R.java文件及其内容在Java程序中通过R.java类引用资源的方法是“R.资源类型.资源名称”,其中的“资源类型”可以是放置图像的文件夹、XML文件或布局文件,而“资源名称”是资源文件名或XML文件中的变量名。例如,R.drawable.background表示使用资源目录中的res\drawable\background.png图片文件;R.string.title表示使用资源文件res\values\string.xml中定义的title字符串变量;R.layout.activity_main表示使用资源目录中的res\layout\activity_main.xml布局文件;R.anim.anim表示使用res\anim\anim.xml动画定义文件。2.  图片资源的管理与使用Android Studio工程项目提供了mipmap文件夹和drawable文件夹管理图片资源文件。新建工程项目时,系统会在res资源文件夹中自动创建多个drawable或mipmap文件夹,如drawablehdpi、drawablemdpi、mipmaphdpi、mipmapmdpi等,具体取决于Android Studio的版本。当应用程序安装在不同显示分辨率的终端上时,程序会自适应地选择加载xxhdpi、xhdpi、hdpi或mdpi文件夹中的资源。例如一部屏幕密度为320的手机,会自动使用drawable_xhdpi文件夹下的图片。如果有默认文件夹drawable,则系统如果在其他dpi文件夹下找不到图片时会使用drawable中的图片。谷歌公司建议将应用程序的图标文件放在mipmaps文件夹中,这样可以提高系统渲染图片的速度,提高图片质量,减小GPU压力。mipmap支持多尺度缩放,系统会根据当前缩放范围选择mipmap文件夹中适当的图片。而如果将图片放在drawable文件夹下,将根据当前设备的屏幕密度选择恰当的图片。【例34】工程Demo_03_UseImageResource以设置ImageView的图片属性为例演示了如何在XML文件中引用图片资源的方法。首先将某个图片文件复制到工程中的mipmap文件夹下,图311是把background.jpg复制到工程中以后的效果。图311在工程中添加图片在布局XML文件中,通过“@mipmap/图片文件名”的方式引用mipmap文件夹中的图片文件,实现代码如代码段39所示,运行结果如图312所示。代码段3-9在XML文件中引用图片资源【例35】工程Demo_03_SetBackgroundForActivity以设置Activity的背景图片为例演示了如何在Java源代码中引用图片资源的方法。首先将某个图片文件复制到工程中的mipmap文件夹下。在Java源代码中,通过“R.mipmap.图片文件名”的方式引用mipmap文件夹中的图片文件。本例中,通过调用this.getWindow().setBackgroundDrawableResource()方法设定某个图片作为APP的背景,在onCreate()方法中的实现代码如代码段310所示,运行结果如图313所示。代码段3-10在Activity中设定APP的背景protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.getWindow().setBackgroundDrawableResource(R.mipmap.background);//用指定图片作为背景setContentView(R.layout.activity_main);}图312设置ImageView的图片属性图313设置Activity背景

3.  字符串资源的管理与使用字符串资源描述文件strings.xml一般位于工程res文件夹下的values子文件夹中。如果需要在Activity代码或布局文件中使用字符串,可以在strings.xml文件中的标签下添加相应的元素,定义字符串资源。元素的基本格式是字符串的内容代码段311是一个典型的strings.xml示例,其中定义了两个字符串变量。代码段3-11典型的string.xml代码段MyFirstApplicationHello world!上述代码段的第1行定义了XML版本与编码方式。第2行以后在标签下定义了两个元素,分别定义了两个字符串,字符串的名称分别为app_name和hello_world。如果需要在Java程序代码中使用这些字符串,可以用“R.string.字符串名称”的方式引用。如果在XML文件中使用这些字符串,则用“@string/字符串名称”的方式引用。Android解析器会从工程的res/values/strings.xml文件里读取相应名称变量的值并进行替换。4.  数组资源的管理与使用与字符串资源类似,数组描述文件arrays.xml位于工程res文件夹下的values子文件夹中。数组资源也定义在标签下,其基本语法如下: 数组元素值数组元素值数据类型-array>代码段312是一个典型的array.xml示例,在其中定义了两个字符串数组,数组名分别是citys和modes。代码段3-12典型的array.xml代码段北京天津上海123在XML中引用数组资源的方法是“@array/数组名称”,在Java代码中引用数组资源的方法是“getResources().getXxxArray(R.array.数组名称)”,例如: String[] citys =getResources().getStringArray(R.array.citys);int[] modes =getResources().getIntArray(R.array.modes);5.  颜色描述资源的管理与使用颜色描述文件strings.xml位于工程res文件夹下的values子文件夹中,其典型内容如代码段313所示。代码段3-13典型的color.xml代码段#3F51B5#303F9F#FF4081在标签下添加相应的元素,定义颜色资源,其基本格式如下: 该颜色的值颜色值通常为8位的十六进制的颜色值,表达式顺序是#aarrggbb,其中aa表示alpha值(00~FF,00表示完全透明,FF表示完全不透明),rr表示红色分量的值(00~FF),gg表示绿色分量的值(00~FF),bb表示蓝色分量的值(00~FF)。例如,#7F0400ff,其中7F表示透明度,0400ff表示色值(red值为04,green值为00,blue值为FF)。任何一种颜色的值范围都是0~255(00~FF)。颜色值也可以为6位的十六进制的颜色值,表示一个完全不透明的颜色,表达式顺序是#rrggbb。例如,#0400FF,则red值为04,green值为00,blue值为FF。在XML中引用颜色资源的方法是“@color/颜色名称”,例如: android:textColor=”@color/colorAccent”在Java代码中引用颜色资源的方法是“getResources().getColor(R.color.颜色名称)”或“ContextCompat.getColor(context, R.color.颜色名称)”,例如: TextView hello=(TextView)findViewById(R.id.hello);hello.setTextColor(getResources().getColor(R.color.colorPrimary));6.  引用assets文件夹中的资源同res文件夹相似,assets也是存放资源文件的文件夹,但两者有所不同,res文件夹中的内容会被编译器所编译,assets文件夹则不会。也就是说,应用程序运行的时候,res文件夹中的内容会在启动的时候载入内存,assets文件夹中的内容只有在被用到的时候才会载入内存,所以一般将一些不经常使用的大资源文件存放在该目录下,例如应用程序中使用的音视频文件、图片、文本文件等。在程序中可以使用getResources.getAssets().open(“文件名”)的方式得到资源文件的输入流InputStream对象。3.3界面元素的常用属性每个View和ViewGroup对象支持其自身的各种XML属性。一些属性对所有View对象可用,因为它们是从View基类继承而来的,例如id属性;而有些属性只有特定的某一种View对象及其子类可用,例如TextView及其子类支持textSize属性。3.3.1控件ID及其使用在XML布局文件中,可以通过设置android: id属性来给相应的Widget控件指定ID,通常是以字符串的形式定义一个ID;而在Java中则可以通过调用setId(int)方法来实现给控件指定ID。通过这个ID,可在XML布局或Activity代码中引用相应的控件。例如,如果新添加了一个按钮Button,在XML布局文件中采用如下方式为其分配ID号: android:id=”@ id/my_button”这里在“@ id/”后面的字符是设定的ID号,@表示XML解析器应该解析ID字符串并把它作为ID资源;“ ”表示这是一个新的资源名字,它被创建后应加入到资源文件R.java中。在Java代码中引用相应的ID时,则不需要 符号,只需创建这个View对象(如Button)的实例名,并通过其ID号获取它。例如,代码段314给出在Activity中通过ID号取得布局上的元素句柄,此例中ID为my_button。代码段3-14通过findViewById()取得控件句柄@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在activity_main.xml中应提前定义好Button的IDButton myButton = (Button) findViewById (R.id.my_button);//取得Button控件句柄,存储到myButton对象中myButton.setText(“hello”);//字符串hello显示在ID号为my_button的Button控件中}在定义资源之前,要先使用android: id属性定义其ID号,这样该资源才能被记录到

书摘插画
插图

插图

插图

插图

插图

插图

抢先评论了 “Android软件开发教程(第2版)” 取消回复

评论

还没有评论。

相关产品

加入购物车

从零开始学微信小程序开发

EUR €35.99
阅读更多
缺货

华为防火墙技术漫谈

EUR €58.99
加入购物车

Android Studio开发实战:从零基础到App上线(第2版)

EUR €78.99
加入购物车

Android App开发从入门到精通

EUR €48.99
评分 5.00 &sol; 5

东东购的宗旨是服务喜爱阅读中文书籍的海外人民,提供一个完善的购书平台,让国人不论何时何地都能沉浸在书香之中,读着熟悉的中文字,回忆着家乡的味道。


安全加密结账 安心网络购物 支持Paypal付款

常见问题

  • 货物配送
  • 退换货政策
  • 隐私政策
  • 联盟营销

客户服务

  • 联系东东
  • 关于东东
  • 帮我找书
  • 货物追踪
  • 会员登入

订阅最新的优惠讯息和书籍资讯

选择币别

EUR
USD
CAD
AUD
NZD
NOK
GBP
CHF
SEK
CNY
UAH
ILS
SAR
MXN
KRW
MYR
SGD
HUF
TRY
JPY
HKD
TWD
facebookinstagram
©2020 东东购 EasternEast.com

限时特卖:用“SALE15”优惠券全场书籍85折!可与三本88折,六本78折的优惠叠加计算。 忽略