android开发教程幻灯片_第1页
android开发教程幻灯片_第2页
android开发教程幻灯片_第3页
android开发教程幻灯片_第4页
android开发教程幻灯片_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

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

文档简介

1、Android开发教程,第一章 Android概述 第二章 Android开发环境搭建 第三章 Android的Hello World应用程序 第四章 Android用户界面开发 第五章 Android数据存储开发 第六章 Android开发实例,1,2,第一章 Android概述,1.1 什么是Android 1.2 Android的体系结构 1.3 Android的应用程序组件,2,2,Android的发展,Android一词的本义指“机器人”,2003年美国有一家以Android为名的小公司成立,开发手机平台。 Google在2005年收购Android之后,继续进行对Android系统

2、开发。 Google于2007年11月5日发布了开源的Android平台,并组建了开放手机联盟(Open Handset Alliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业,3,2020/7/7,Android的发展,在Google及其开放手机联盟推出基于Linux平台的开源手机操作系统Android之后,Google又不惜重金举办了Android开发者大赛,吸引了众多开发者的目光。因为Android不仅功能强大,而且具有开放和免费等先天优势,所以全球范围内的电信行业、手机制造商更是毫不犹豫地加入到Android开放手机联盟中来。 2008年9月

3、22日,美国运营商T-Mobile USA在纽约正式发布了第一款基于Android操作系统的手机T-Mobile G1,这让更多的移动设备厂商看到了Android的光明前景都纷纷加入其中,甚至Android已经涉足上网本市场。中国移动也在Android的基础之上推出了自己的操作系统OMS。,4,2020/7/7,Android的发展,2009年1季度 G1销售100万支 2009.3 MWC华为发布Android手机 Moto,三星,LG计划2009年下半年推出Android手机 2009 获得Orange, Vodafone, O2, Telefonica支持 2009进军上网本,5,202

4、0/7/7,Android的特点,开放性 应用程序无界限 应用程序是在平等的条件下创建的 应用程序可以轻松地嵌入网络 应用程序可以并行运行,6,2020/7/7,Android的特点,应用程序无界限:Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可供其他应用程序使用。,7,2020/7/7,Android的特点,应用程序是在平等的条件下创建的:移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。,8,2020/7/7,Android的特点,应用程序可以轻松地嵌入网络:应用程序可以轻松地嵌入HTML、JavaScr

5、ipt和样式表,应用程序还可以通过WebView显示网络内容。,9,2020/7/7,1.1 什么是Android,Android是一款针对移动设备的软件堆栈,其中包括操作系统(基于Linux内核)、中间件和关键应用程序。 基于Android平台的应用程序的开发,可以在Android SDK(Software Development Kit,软件开发工具包)的帮助下使用Java语言来完成。 Android SDK为我们提供了一组必要工具包和的API(Application Programming Interface,应用程序编程接口)。,10,2020/7/7,1.1 什么是Android,A

6、ndroid采用Linux为操作系统,所以系统程序包含了C语言的标准函数库。 应用程序主要以Java语言在Dalvik VM虚拟机上执行。 应用程序开发环境以Eclipse为主,加上Android Development Tools (ADT)插件及Android SDK。 Android平台的主旨是提供一个应用程序架构(Application Framework),好让各家OEM厂商可不必从头进行软件开发,就能推出一系列的Android平台手机。,11,2020/7/7,Android通常拥有的特性,(1) Application framework:提供可重复使用及改写的组件。 (2) D

7、alvik virtual machine:提供给移植设备一个优化过的Java虚拟机。 (3) Integrated browser:基于开放源码的WebKit引擎的一个浏览器,像Mac上的Safari也是从WebKit衍生出来的。 (4) Optimized graphics:优化过的绘图函数库,包含了SGL的2D绘图函数库及基于OpenGL ES 1.0规范的3D绘图函数库。 (5) SQLite:一个结构化的数据库系统。,12,2020/7/7,Android通常拥有的特性,(6) Media support:多媒体影音格式的支持,包含了MPEG4,H.264,MP3,AAC,AMR,J

8、PG,PNG,GIF。 (7) GSM:GSM手机的通话能力其实必须在硬件电路层次实现,软件层次无法实现,只是Android平台要求必须要有GSM通话能力,此项功效特点与其说是特性,不如说是订立出最低的硬件要求规范。 (8) Bluetooth, EDGE, 3G, Wi-Fi, camera, GPS, compass, and accelerometer:同GSM一样,它必需由实际硬件决定是否支持。 (9) Rich development environment:包含了设备模拟器,调试工具,内存及性能评估分析工具及让Eclipse IDE支持Android项目的插件。,13,2020/7

9、/7,1.2 Android的体系结构,Android的体系结构分成(1)Applications,(2)Application Framework,(3)Libraries,(4)Android Runtime,(5)Linux Kernel五大部分。 Android本身是一套软件堆栈(Software Stack),或称为“软件迭层架构”,迭层主要分成三层:操作系统、中间件(Middleware)、应用程序。想开发可在Android平台上运行的应用程序,可用Java程序语言编写。,14,2020/7/7,1.2 Android的体系结构,15,2020/7/7,Applications,A

10、ndroid系统自带的应用程序通常包含有电子邮件程序、短信程序、日历、地图、浏览器、通讯录程序等,所有的应用程序都由Java语言编写。,16,2020/7/7,Application Framework,应用程序开发人员在编写应用程序时可以完整的使用统一的API接口。 这个应用程序框架是可以容易重复使用各种组件,这样应用程序就可以只需提供出它自己本身的特殊功能。 应用程序还可以较容易的去使用其它程序的特殊功能。这种统一机制,有助于开发人员去编写自己新的软件组件,而不用编写一些已经存在的重复代码,提高开发效率。,17,2020/7/7,Application Framework组件,(1) Vi

11、ews System(视图系统) (2) Content Providers(内容提供器) (3) Resource Manager(资源管理器) (4) Notification Manager(通知管理器) (5) Activity Manager(活动管理器),18,2020/7/7,Application Framework组件,(6) Window Manager(窗口管理器) (7) Location Manager(定位管理器) (8) Telephony Manager(电话管理器) (9) Package Manager(包管理器) (10) XMPP Service:eXt

12、ensible Messaging and Presence Protocol,19,2020/7/7,Libraries,(1) System C library:一个由BSD衍生出来的标准C系统函数库(libc),这个函数库已针对Linux嵌入式设备进行过优化。 (2) Media Libraries:基于PacketVideos OpenCORE的多媒体函数库;这个多媒体函数库支持播放和录制许多现在很流行的声音及影像格式。比如:MPEG4,H.264,MP3,AAC,AMR,JPG及PNG。 (3) Surface Manager:这个部份让开发者可以去存取显示系统,以及无接缝的实现2D

13、/3D多应用程序之间的整合。 (4) LibWebCore:一个先进的网页浏览器引擎。 (5) SGL:2D图形引擎库。,20,2020/7/7,Libraries,(6) 3D Libraries:一个基于OpenGL ES 1.0规范的3D图像引擎库。它可以选择硬件的3D加速或高度优化的3D软件程序去实现效果。 (7) Free Type:位图及矢量字形。 (8) SQLite:SQLite是一套开放源码的关系数据库,供Android上所有的应用程序使用。其特点在于轻量型(仅500KB左右的大小),适合手持式设备使用;此外桌面型计算的应用程序也有使用,如OpenO 2.0

14、版之后就有内建的SQLite。 (9) SSL - Secure Socket Layer,专门用于保护网页通讯的协议。,21,2020/7/7,Android Runtime,Android虽然使用Java程序语言来开发、编写应用程序,但却不使用一般大家目前在用的Java Runtime(J2ME)版本来执行Java程序,而是用Android自有的Android Runtime来执行。Android Runtime包含下面两个核心。 (1) Core Libraries (2) Dalvik Virtual Machine,22,2020/7/7,Linux Kernel,Android平台

15、的操作系统使用的是Linux,其核心版本为2.6版 Android所用的Linux核心,包含的功能主要有:安全(Security)、内存管理(Memory Management)、进程管理(Process Management)、网络堆栈(Network Stack)、驱动程序模型(Driver Model)等 另外在前述的软件堆栈与硬件间建立起一个抽象层(Abstraction Layer)。,23,2020/7/7,1.3 Android的应用程序组件,Activity Service ContentProvider BroadcastReceiver,24,2020/7/7,第二章 An

16、droid开发环境搭建,2.1 下载并安装JDK 2.2 下载并安装SDK 2.3下载并安装eclipse 2.4 下载并安装ADT,25,2,工具包关系,Android的开发环境指用于开发Android应用程序所需要的基本的开发工具,主要包括四个部分,分别是JDK、eclipse、ADT及Android SDK。,26,2020/7/7,2.1 下载并安装JDK,(1) 下载最新的JDK,下载地址为:,27,2020/7/7,2.1 下载并安装JDK,(2)安装JDK (3) 配置JDK,28,2020/7/7,2.1 下载并安装JDK,(4) 测试JDK,29,2020/7/7,2.2 下

17、载并安装SDK,(1) 下载Android SDK,我们可以到下载地址,30,2020/7/7,2.2 下载并安装SDK,(2) 安装Android SDK,31,2020/7/7,2.2 下载并安装SDK,(3) 下载Android SDK的其他组件,32,2020/7/7,2.2 下载并安装SDK,(4) 配置Android SDK,33,2020/7/7,2.2 下载并安装SDK,(5) 测试Android SDK的配置,34,2020/7/7,2.3下载并安装eclipse,(1) 下载eclipse,35,2020/7/7,2.3下载并安装eclipse,(2)安装eclipse,3

18、6,2020/7/7,2.4 下载并安装ADT,ADT是Google为Android开发者提供的Eclipse插件,可以很方便的开发应用程序,下面我们来安装和安装ADT插件,步骤如下: (1) 下载ADT。我可以在找到ADT的下载链接,37,2020/7/7,2.4 下载并安装ADT,(2) 安装ADT,38,2020/7/7,2.4 下载并安装ADT,(3) 配置ADT,39,2020/7/7,第三章Hello World应用程序,3.1 创建Hello World应用程序 3.2 应用程序结构分析 3.3 调试应用程序 3.4 导入已存在项目,40,2,3.1 创建Hello World应

19、用程序,ADT提供了简单的生成Android应用框架的功能,我们现在使用ADT通过Eclipse创建一个Android工程。 在创建工程之前,首先要有一个运行应用程序的环境,可以是真实的Android手机,也可以是模拟器。这里使用模拟器的方式,即使用AVD来运行我们的应用程序。,41,2020/7/7,什么是AVD,从Android 1.5开始引入了AVD(Android Virtual Device)这个概念。 AVD是一个经过配置的模拟器。在创建AVD时可以配置的选项有:模拟器影像大小、触摸屏、轨迹球、摄像头、屏幕分辨率、键盘、GSM、GPS、Audio录放、SD卡支持、缓存区大小等。,4

20、2,2020/7/7,创建AVD,下面我们便来配置Android模拟器,具体步骤如下所示。 (1) 打开“Android SDK and AVD Manager”,43,2020/7/7,创建AVD,(2) 新建AVD,44,2020/7/7,创建AVD,(3) 运行AVD,45,2020/7/7,3.2 应用程序结构分析,“Package Explorer”导航器中的“HelloWorld”项目,46,2020/7/7,R.java,R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改,R.java文件是定义该项目所有资源的索引文件。先来看看“HelloWorld”项目的R.j

21、ava文件,47,2020/7/7,AndroidManfest.xml,AndroidManfest.xml文件则包含了该项目中所使用的Activity、Service、Receiver,我们先来打开“HelloWorld”项目中的AndroidManfest.xml文件,48,2020/7/7,String.xml,资源文件中一些常量的定义,49,2020/7/7,main.xml,“HelloWorld”项目的布局文件(layout),50,2020/7/7,布局和参数,LinearLayout android:orientation:表示这个介质的版面配置方式是从上到下垂直地排列其内部

22、的视图。 android:orientation:表示这里是水平排列 android:layout_width:定义当前视图在屏幕上所占的宽度,fill_parent即填充整个屏幕。 android:layout_height:定义当前视图在屏幕上所占的高度,fill_parent即填充整个屏幕。 wrap_content:随着文字栏位的不同而改变这个视图的宽度或高度。 layout_weight:用于给一个线性布局中的多个视图的重要度赋值。,51,2020/7/7,布局和参数,TextView android:layout_width为整个屏幕的宽度 android:layout_heigh

23、t可以根据文字来改变高度 android:text则设置了这个TextView要显示的文字内容,这里引用了string中的hello字符串,即String.xml文件中的hello所代表的字符串资源。hello字符串的内容“Hello World, HelloWorld!”这就是我们在“HelloWorld”项目运行时看到的字符串。,52,2020/7/7,HelloWorld.java,主程序HelloWorld类继承自Activity类,重写了void onCreate(Bundle savedInstanceState)方法。 在onCreate方法中通过setContentView(R

24、.layout.main)设置了Activity要显示的布局文件(layoutmain.xml)。,53,2020/7/7,结构特点,以上的应用程序结构是Android开发的特点,这样可以很轻松地将代码和UI(User Interface,用户接口;用户界面)分开,在国际化和程序维护方面有着巨大的作用。 如果Android程序需要自适应国际化,比如说多国语言等问题,那么就可以定义不同语言的UI布局,在程序装载时调用不同的布局。 而且,如果需要修改UI的一些问题,就不必查看代码了,直接更改这些布局文件即可。 当然,这需要开发者在开发时使用这种MVC框架,尽量减少使用“硬编码”。,54,2020/

25、7/7,3.3 调试应用程序,在eclipse开发工具中调试程序的方法很多,但是使用eclipse调试Android程序时需要注意一些细节上的问题。 DDMS的使用 断点的使用 adb的使用,55,2020/7/7,DDMS的使用,在eclipse + ADT的开发环境中没有直接跟踪对象内容的方法,但是我们可以使用Google提供的ADT插件DDMS(Dalvik Debug Monitor Service)在eclipse上轻松地调试Android程序。 DDMS为我们提供了许多功能,例如:测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息,LogCat,广播状态信息,模拟电话呼叫,接

26、收SMS,虚拟地理坐标等等 (1) 切换到DDMS的方法 (2) LogCat使用 (3) File Explorer使用,56,2020/7/7,切换到DDMS的方法,57,2020/7/7,切换到DDMS的方法,在“DDMS”界面中选择“Devices”标签,查看其菜单的功能,我们可以看到Debug Process(调试进程)、Update Threads(更新线程)、Update Heap(更新堆)、Cause GC(引起垃圾回收)、Stop Process(停止进程)、Screen Capture(屏幕截图)、Reset adb(重启Android Debug Bridge)菜单选项,

27、如图51所示。 Android程序运行时的各种状态,比如进程信息、线程分析、堆内存的占用,结束一个进等程。当然,这些操作都是在DDMS框架下进行的,日常开发的程序是无法执行调用的。如果adb调试桥运行不稳定,可以选择“reset adb”来重新启动“adb.exe”进程。,58,2020/7/7,LogCat使用,“LogCat”通过“android.util.Log”类的静态方法来查找错误和打印系统日志消息。它是一个进行日志输出的API,我们在Android程序中可以随时为某一个对象插入一个Log,然后在DDMS中观察LogCat的输出是否正常。android.util.Log常用的方法有以

28、下5个: Log.v(String tag, String msg); Log.d(String tag, String msg); Log.i(String tag, String msg); Log.w(String tag, String msg); Log.e(String tag, String msg);,59,2020/7/7,LogCat使用,这5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。 当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不同,我们可以控制要显示的某一类错误,一般我们如果使用“断点”方式来调试程序,则使用Log.

29、e比较合适。 但是根据规范建议Log.v,Log.d信息应当只存在于开发过程中,最终版本只可以包含Log.i,Log.w,Log.e这三种日志信息。,60,2020/7/7,LogCat使用,下面对“HelloWorld”程序进行调试,首先修改“HelloWorld.java”,61,2020/7/7,LogCat使用,点击“Run”“Debug”菜单命令,进入调试模式,62,2020/7/7,LogCat使用,切换到“DDMS”界面,在“Devices”标签中选择项目运行的AVD,并点击“LogCat”标签,63,2020/7/7,File Explorer使用,File Explorer显

30、示的是已经连接的AVD的文件及目录,通过File Explorer可以向AVD上传文件或从AVD中下载文件的本地。下面介绍文件的上传方法。 在“Devices”标签中选择已经运行的AVD,并选择“File Explorer”,打开SD卡所在的目录,最后上传文件,,64,2020/7/7,断点的使用,在调试Android程序时,我们同样可以通过设置断点的方式来调试程序。在启动应用程序进行调试时,eclipse会自动切换到Debug透视图。毫无疑问,最常见的调试步骤是设置断点,这样可以检查条件语句或循环内的变量和值。 要在Java透视图的Package Explorer视图中设置断点,双击选择的源

31、代码文件,在一个编辑器中打开它。遍历代码,将鼠标放在可疑代码一行的标记栏(在编辑器区域的左侧)上,双击即可设置断点。 (2) 点击“Run”“Debug”菜单命令,切换到了“Debug”页面,这里可以对程序进行调试。,65,2020/7/7,adb的使用,Android调试桥(Android Debug Bridge, adb)是多种用途的工具,该工具可以帮助我们管理设备(Android-powered device)或模拟器(emulator instance)的状态。 Android调试系统是一个客户/服务器系统,包括三个组成部分。 一个在你用于开发程序的电脑上运行的客户端。你可以通过sh

32、ell端使用adb命令启动客户端。其他Android工具比如说ADT插件和DDMS同样可以产生adb客户端。 在你用于发的机器上作为后台进程运行的服务器。该服务器负责管理客户端与运行于模拟器或设备上的adb守护程序(daemon)之间的通信。 一个以后台进程的形式运行于模拟器或设备上的守护程序(daemon)。,66,2020/7/7,(1) 发出adb命令,发出Android命令:可以在我们的开发机上的命令行或脚本上发布Android命令,使用方法: adb -d|-e|-s ,67,2020/7/7,(2) 查询模拟器或设备实例,在发出adb命令之前,有必要知道什么样的模拟器或设备实例与a

33、db服务器是相连的。可以通过使用devices命令来得到一系列相关联的模拟器或设备:adb devices 作为回应,adb为每个实例都制定了相应的状态信息:,68,2020/7/7,(3) 给特定的模拟器或设备实例发送命令,如果有多个模拟器或设备实例在运行,在发布adb命令时需要指定一个目标实例。这样做,需使用-s选项的命令。使用-s选项的格式是:adb -s 如上所示,给一个命令指定了目标实例,这个目标实例使用由adb分配的序列号。我们可以使用devices命令来获得运行着的模拟器或设备实例的序列号来运行命令,如图中所示,这个命令在emulator-5554上安装软件包ESFileExpl

34、orer.apk。,69,2020/7/7,(4) 安装软件,我们可以使用adb从开发电脑上复制一个应用程序,并且将其安装在一个模拟器或设备实例。像这样做,使用install命令。这个install命令要求我们必须指定所要安装的.apk文件的路径:adb install ,70,2020/7/7,(5) 卸载软件,卸载软件使用uninstall命令,其使用格式如下: adb uninstall 这里的package为安装的软件的包名,这里以我们前面的HelloWorld项目为例,包名即为“org.myandroid.HelloWorld”,当运行程序使模拟器死机时,我们也可以使用uninsta

35、ll命令来强行卸载这个应用程序。,71,2020/7/7,(6) 启动shell命令,db提供了shell端,通过shell端你可以在模拟器或设备上运行各种命令。这些命令以2进制的形式保存在本地的模拟器或设备的文件系统中。 不管我们是否完全进入到模拟器或设备的adb远程shell端,我们都能用shell命令来执行命令。当没有完全进入到远程shell的时候,这样使用shell命令来执行一条命令: adb -d|-e|-s shell 进入模拟器或设备的远程shell端时,这样使用shell命令: adb -d|-e|-s shell,72,2020/7/7,(6) 启动shell命令,通过adb

36、远程shell端,我们可以通过sqlite3命令程序来管理数据库。sqlite3工具包含了许多使用命令,比如:“.dump”:显示表的内容,“.schema”:可以显示出已经存在的表空间的SQL CREATE结果集。sqlite3还允许你远程执行SQL命令。,73,2020/7/7,(7) 关闭adb server,在某些情况下,我们可能需要终止Android调试系统的运行,然后再重新启动它。例如,如果Android调试系统不响应命令,我们可以先终止服务器然后再重启,这样就可能解决这个问题,用kill-server可以终止adb server。 可以用adb发出的任何命令来重新启动服务器。ki

37、ll-server命令的使用格式如下:adb kill-server,74,2020/7/7,3.4 导入已存在项目,在安装了Android开发环境之后,可以直接将Android项目导入到eclipse中。 启动eclipse,选择“File”“Import”菜单,展开“General”项,选择“Existing Projects into Workspace”导入项目到工作空间。,75,2020/7/7,3.4 导入已存在项目,然后点击“Next”按钮,进入选择项目文件目录,选择好项目目录后,点击“Finish”按钮,等待导入项目完成。如果需要将项目文件一起拷贝到工作空间,就需要选择“Cop

38、y projects into workspace”复选框。,76,2020/7/7,第四章 Android用户界面开发,4.1 用户界面开发简介 4.2 单个Activity的用户界面示例 4.3 多个Activity的用户界面示例,77,2,4.1 用户界面开发简介,Android的用户界面可以有两种实现方式:使用XML或者是使用Java代码。 通过直接书写代码的方式来实现界面是比较麻烦的事情。举个例子来说,如果我们有DHTML的经验,那么这两者的区别可以比喻为:用XML来实现用户界面就像直接写HTML代码,而用Java代码来实现用户界面就像用JavaScript创建DOM对象来拼接页面。

39、 所以,使用XML来布局界面应该是首选。,78,2020/7/7,XML布局,Android使用一个XML文件来定义用户界面。为了方便理解,我们可以直接把它理解为一个HTML文件。事实上,它也确实比较像一个HTML文件。,79,2020/7/7,XML布局,这里面有一个比较重要的类叫做ViewGroup,这个XML的root节点必须是一个ViewGroup,或者是一个单一的Widget(整个XML只有一个元素)。 Android几乎所有的UI似乎都和ViewGroup有或多或少的关系。但是它只是一个abstract class,并不能直接使用,我们能用的,是它的一些子类,例如:Absolute

40、Layout、FrameLayout、LinearLayout、RelativeLayout、TableLayout等,,80,2020/7/7,XML布局,AbsoluteLayout:绝对定位的布局方式,在它内部嵌套的元素必须指定具体的位置。 FrameLayout:帧布局方式,说帧不太容易理解,可以说成是层布局方式,也就是说,在它内部的元素,是一层一层的叠加在一起的。如果用过Photoshop,或者Flash,这里面的层的概念是和他们一致的。如果最上层的元素是不透明的,并且比下面的元素尺寸要大,那么将看不到下面的元素,只能看到顶层元素。这些层的顺序是:最新声明的放到最前面。可以这样理解,

41、Android按文件的书写顺序来组织这个布局,先声明的放在第一层,再声明的放到第二层,最后声明的放在最顶层。,81,2020/7/7,XML布局,LinearLayout:线性布局方式,这种布局比较常用,也比较简单,就是每个元素占一行,当然也可能声明为横向排放,也就是每个元素占一列。 RelativeLayout:相对定位的布局方式,在定位元素的位置的时候,使用相对位置,可以相对其他元素,也可以相对这个布局。就像是说:我现在站在A和B的中间;或者说,我站在队伍的中间。前者就是相对其他元素来定义位置,后者是相对整个布局来定义位置。 TableLayout:表格的布局方式,这里面的Table和HT

42、ML中的Table类似。,82,2020/7/7,XML布局,从上面这几个类从名字就可看的出来,他们是Layout,也就是布局。如果用过HTML,那么每一个Layout,可以理解为有了特定排版样式的DIV。在DIV的内部,可以放置其他的DIV,当然也可以放置最底层的元素,比如说文本、文本框、单选按钮、图片等等。这里面所说的最底层的元素,它们有一个超类叫做View,同时ViewGroup也是它的子类。ViewGroup就是能容纳其他View的View。,83,2020/7/7,ViewGroup和View总结,(1) ViewGroup ViewGroup是一个android.view.View

43、Group(android.view.View的子类)类的对象,顾名思义,ViewGroup是一个特殊的View对象,他的功能是装载和管理一组下层的View和其他的ViewGroup,ViewGroup可以为UI增加结构,并且将复杂的屏幕元素构成一个独立的实体。作为一个基类,ViewGroup为Layout(布局)服务,Layout则是一组提供屏幕界面通用类型的完全实现子类。Layout可以为一组View构建一个结构。,84,2020/7/7,ViewGroup和View总结,(2) View 任何一个View对象都将继承android.view.View类。它是一个存储有屏幕上特定的一个矩形

44、布局和内容属性的数据结构。一个View对象可以处理测距、布局、绘图、焦点变换、滚动条,以及屏幕区域自己表现的按键和手势。View类为Widget服务,Widget则是一组用于绘制交互屏幕元素的完全实现子类。Widget处理自己的测距和绘图,所以可以快速地用它们素构建UI。可用到的Widget包括TextView、EditText、Button、RadioButton、CheckBox和ScrollView等。,85,2020/7/7,XML布局总结,(1) 这个XML文件是由许多View嵌套组成的。 (2) 如果布局中有多个元素,那么最顶层必须是ViewGroup(一个ViewGroup对象同

45、时也是一个View对象),不可以是View,如果整个布局只有一个元素,那么最顶层元素就是这个唯一的元素。 (3) 在ViewGroup可以内部嵌套View(既然可以嵌套View,就更可以嵌套ViewGroup了) (4) 在View中,不可嵌套其他东西了,要不然它就是ViewGroup了,就是这么定义的。,86,2020/7/7,Hello World应用程序用户界面分析,这里将针对上一章创建的“HelloWorld”项目,对其用户界面作简要介绍。 main.xml R.java HelloWorld.java,87,2020/7/7,main.xml,main.xml源码详细解释如下,这里每

46、一种元素可以定义属性有很多,并且这些属性都可以和HTML的css中的属性来类比。 (1) 首先,定义了一个LinearLayout,前面说过,这个布局要么将子元素水平排列,要么将它们竖直排列。 (2) 然后,定义了一个TextView,一个TextView,就是一块区域,用来显示文本,用这个View定义的元素只能用来显示,是不可以编辑的,如果想要可编辑的文本块,那么应该使用它的子类EditText。,88,2020/7/7,R.java,这里涉及到了一些资源文件,直观的说,就是res目录下的那些目录和文件,常用的有: res/drawable/:用来存放图片文件 res/layout/:用来存

47、放布局定义文件 res/values/:用来存放一些变量、参数等文件,89,2020/7/7,R.java,这里涉及到了一些资源文件,直观的说,就是res目录下的那些目录和文件,常用的有: res/drawable/:用来存放图片文件 res/layout/:用来存放布局定义文件 res/values/:用来存放一些变量、参数等文件 这些资源文件都是独立于代码而存在的,在代码中要访问到这些资源需使用R.java文件。在Android的代码中,有一个文件比较奇怪,这个文件就是R.java,在R.java的注释部分,有这样一段话:“AUTO-GENERATE FILE. DO NOT MODIFY

48、”,这个文件是自动生成的,不要修改。,90,2020/7/7,R.java, 这个文件就是Java代码和独立于Java代码的资源文件之间的访问窗口,Java程序可以通过R.java来访问那些资源文件。 这个文件是在程序编译过程中由aapt(Android Asset Packaging Tool)自动生成 这个文件中的属性都是public static final的,所以可以直接在Java代码中引用,每个属性都代表一个资源,看起来就像为每个资源都定义了一个ID,然后通过这个ID来访问资源 所有的资源文件都被编译进最后生成的二进制包中,这样能够带来很高的性能和效率,91,2020/7/7,Hel

49、loWorld.java,接下来再看一下,如何在Java代码中使用这个R.java。,92,2020/7/7,HelloWorld.java,这其中的R.layout.main,通过setContextView(),被Java程序调用。 这段代码中引入了另外一个非常重要的概念:Activity。如果套用MVC来理解的话:ViewGroup和View属于View领域的东西,Activity可以理解为Control领域的东西,虽然可以这么类比着来理解,但是Activity其实做了更多的事情,由它将View和一些数据、操作等结合在一起,完成一个相对完整的行为、活动。所以,任何View要被显示,必须通

50、过Activity来进行。这样每个Activity都会包含特定的行为,多个Activity互相合作,最终组成一个完整的Android程序。 在示例的Activity中,有一个onCreate()方法,这个方法会在此Activity被创建的时刻调用。在方法内部,设置此Activity的视图为R.layout.main中定义的视图,也就是res/layout/main.xml中定义的视图(视图、布局、GUI、UI意义相同,可统一用View表示)。,93,2020/7/7,4.2 单个Activity的用户界面示例,一个简单的和用户交互的示例,这个程序的需求是: 画面上有三行元素,第一行是一个Tex

51、tView,用来显示文字 第二行是一个EditText,用户将在此输入文字 第三行是一个Button 用户点击Button之后,会在第一行的TextView中显示:Hello, (用户在第二行中输入的文字)。比如说用户在输入框中输入:“UI”,那么点击Button之后,会在显示区域显示:“Hello, UI”。,94,2020/7/7,4.2 单个Activity的用户界面示例,要完成这个程序,首先是创建一个Android项目,这个默认创建的项目实际就是一个最基本的“HelloWorld”项目,但此时新建的项目名字命名为“HelloOneActivity”,然后是在此基础上修改与完善项目,这里

52、大概需要用5步:,95,2020/7/7,UI的设计,(1) 先完成UI的设计,修改在res/layout/目录下的main.xml的文件,96,2020/7/7,UI的设计,这里解释一下这几个语句: android:id=”+id/textview_display” 这个是用来为当前的View声明一个ID,这样,在Java程序中就可以通过这个ID来找到这个元素,进而能够操作这个元素。 android:textSize=”20px” 声明字体大小为20px,对于每种View,都会有一系列的可以设置的属性,具体的属性可参考每个View的说明文档。,97,2020/7/7,声明资源,(2) 创建好

53、这个布局文件之后,再把这个文件需要的android:text=”string/sayhello”在res/values/strings.xml中声明一下。这时已经可以运行一下这个Activity,看看最终显示的效果是否和预期的一致,如果有差别,可再调整一下。,98,2020/7/7,修改交互动作,第3步,现在,UI已经设计好了,修改ADT自动创建的Activity,其名字为:HelloOneActivity.java,用这个Activity来显示这个UI。,99,2020/7/7,修改交互动作,这里面有些语句需要解释: Button button = (Button) findViewById

54、(R.id.button_sayhello) 这个语句中的findViewById()是一个比较简单、重要、常用并且是一直用的语句,其功能就是在当前的ContentView中按ID来找到对应的View。例如这里,通过R.id.button_sayhello,就能找到第1步提到的Button了。这里面的R.id.button_sayhello是在Build的时候,由aapt自动生成的R.java中的内容。对资源文件中的android:id=”+id/textview_display”,就会在R.java中对应的生成一个ID。 button.setOnClickListener(new View.

55、OnClickListener() 现在的GUI程序,好像都喜欢事件驱动的模型,有人这样描述过GUI系统本质:在事件驱动下动态地展现数据模型的图形系统。在这个语句中,setOnClickListener就是为button添加一个事件监听,监听OnClick事件,也就是说,如果一旦触发button的OnClick事件,就会执行后面定义的功能。,100,2020/7/7,运行程序接口,(4) 运行程序,101,2020/7/7,4.3 多个Activity的用户界面示例,这里将解释如何创建多个Activity的用户界面,以及了解Activity的生命周期。这个多Activity的示例程序的功能大概

56、是这样的: 在主页面上有三个元素:一个文本输入框,两个按钮。用户可以在文本框中输入一些字符 点击第一个按钮,将弹出一个对话框形式的Activity,显示”Hello, ” 如果点击的是第二个按钮,将显示另一个全屏的Activity,显示”Hello, ”,102,2020/7/7,4.3 多个Activity的用户界面示例,(1) 创建项目。这里,项目的名字为“HelloThreeActivity”,应用程序的名字为“Activity Lifecycle”,包名为“org.myandroid.HelloThreeActivity”,默认创建的Activity的名字为“ActivityLifec

57、ycle”。,103,2020/7/7,4.3 多个Activity的用户界面示例,(2) 先完成UI的设计,创建布局。从程序来看,似乎有三个Activity,但是第二个和第三个几乎是相同的,于是,只创建两个布局。,104,2020/7/7,main.xml内容,105,2020/7/7,dialog.xml内容丰富,106,2020/7/7,4.3 多个Activity的用户界面示例,(3) 然后,需要把上面提到的字符变量声明一下,修改res/values/strings.xml,107,2020/7/7,4.3 多个Activity的用户界面示例,(4) 创建Activity,需要定义三个

58、 Activity:分别将他们定义为:ActivityLifecycle(用来显示主画面)、AlertDialog(用来显示对话框)和AlertActivity(用来显示那个全屏的Activity)。 (5) 编辑AndroidManifest.xml,这个文件像一个户口簿一样记录每一个Activity的信息,Android系统会通过这个文件得到:执行这个程序的时候,启动的是那个Activity等信息。不仅如此,这个还包括Intent、Provider等其他一些信息。 (6) 这时就可以运行程序了。,108,2020/7/7,生命周期的详细说明, 如果一个Activity显示在最前端,它的状态

59、是active或者是running 如果一个Activity失去焦点,但是还能在屏幕上看到它,比如说,被一个非全屏的或者是透明的另一个Activity遮盖,它此时的状态是paused。一个处于paused状态的Activity,保持着所有自身的状态和信息,秉持着与window manager的联系,但是当系统内存不足时,可能会被系统终止 如果一个Activity完全看不见了,被其他的Activity完全挡住,它的状态变成stopped。处于stopped的Activity虽然也保留着如同paused状态一样的特性,但是此时的它更容易被系统终止 如果一个Activity处于paused或者stopped状态时,系统可以通过要求Activity结束或者强制kill的方式从内存中删除这个Activity,当它在此需要显示时,就需要restart和重新加载以前的数据,可见,适时的保存数据的重要性,109,2020/7/7,Android应用的生命周期,110,2020/7/7,第五章 Android数据存储开发,5.1 SharedPreferences 5.2

温馨提示

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

评论

0/150

提交评论