




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
android开发教程的资料第1页/共159页第一章
Android概述1.1什么是Android1.2Android的体系结构1.3Android的应用程序组件第2页/共159页Android的发展Android一词的本义指“机器人”,2003年美国有一家以Android为名的小公司成立,开发手机平台。Google在2005年收购Android之后,继续进行对Android系统开发。Google于2007年11月5日发布了开源的Android平台,并组建了开放手机联盟(OpenHandsetAlliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业第3页/共159页Android的发展在Google及其开放手机联盟推出基于Linux平台的开源手机操作系统Android之后,Google又不惜重金举办了Android开发者大赛,吸引了众多开发者的目光。因为Android不仅功能强大,而且具有开放和免费等先天优势,所以全球范围内的电信行业、手机制造商更是毫不犹豫地加入到Android开放手机联盟中来。2008年9月22日,美国运营商T-MobileUSA在纽约正式发布了第一款基于Android操作系统的手机——T-MobileG1,这让更多的移动设备厂商看到了Android的光明前景都纷纷加入其中,甚至Android已经涉足上网本市场。中国移动也在Android的基础之上推出了自己的操作系统OMS。第4页/共159页Android的发展2009年1季度G1销售100万支2009.3MWC华为发布Android手机Moto,三星,LG计划2009年下半年推出Android手机2009获得Orange,Vodafone,O2,Telefonica支持2009进军上网本第5页/共159页Android的特点开放性应用程序无界限应用程序是在平等的条件下创建的应用程序可以轻松地嵌入网络应用程序可以并行运行第6页/共159页Android的特点应用程序无界限:Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可供其他应用程序使用。第7页/共159页Android的特点应用程序是在平等的条件下创建的:移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。第8页/共159页Android的特点应用程序可以轻松地嵌入网络:应用程序可以轻松地嵌入HTML、JavaScript和样式表,应用程序还可以通过WebView显示网络内容。第9页/共159页1.1什么是AndroidAndroid是一款针对移动设备的软件堆栈,其中包括操作系统(基于Linux内核)、中间件和关键应用程序。基于Android平台的应用程序的开发,可以在AndroidSDK(SoftwareDevelopmentKit,软件开发工具包)的帮助下使用Java语言来完成。AndroidSDK为我们提供了一组必要工具包和的API(ApplicationProgrammingInterface,应用程序编程接口)。第10页/共159页1.1什么是AndroidAndroid采用Linux为操作系统,所以系统程序包含了C语言的标准函数库。应用程序主要以Java语言在DalvikVM虚拟机上执行。应用程序开发环境以Eclipse为主,加上AndroidDevelopmentTools(ADT)插件及AndroidSDK。Android平台的主旨是提供一个应用程序架构(ApplicationFramework),好让各家OEM厂商可不必从头进行软件开发,就能推出一系列的Android平台手机。第11页/共159页Android通常拥有的特性(1)Applicationframework:提供可重复使用及改写的组件。(2)Dalvikvirtualmachine:提供给移植设备一个优化过的Java虚拟机。(3)Integratedbrowser:基于开放源码的WebKit引擎的一个浏览器,像Mac上的Safari也是从WebKit衍生出来的。(4)Optimizedgraphics:优化过的绘图函数库,包含了SGL的2D绘图函数库及基于OpenGLES1.0规范的3D绘图函数库。(5)SQLite:一个结构化的数据库系统。第12页/共159页Android通常拥有的特性(6)Mediasupport:多媒体影音格式的支持,包含了MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF。(7)GSM:GSM手机的通话能力其实必须在硬件电路层次实现,软件层次无法实现,只是Android平台要求必须要有GSM通话能力,此项功效特点与其说是特性,不如说是订立出最低的硬件要求规范。(8)Bluetooth,EDGE,3G,Wi-Fi,camera,GPS,compass,andaccelerometer:同GSM一样,它必需由实际硬件决定是否支持。(9)Richdevelopmentenvironment:包含了设备模拟器,调试工具,内存及性能评估分析工具及让EclipseIDE支持Android项目的插件。第13页/共159页1.2Android的体系结构Android的体系结构分成(1)Applications,(2)ApplicationFramework,(3)Libraries,(4)AndroidRuntime,(5)LinuxKernel五大部分。Android本身是一套软件堆栈(SoftwareStack),或称为“软件迭层架构”,迭层主要分成三层:操作系统、中间件(Middleware)、应用程序。想开发可在Android平台上运行的应用程序,可用Java程序语言编写。第14页/共159页1.2Android的体系结构第15页/共159页ApplicationsAndroid系统自带的应用程序通常包含有电子邮件程序、短信程序、日历、地图、浏览器、通讯录程序等,所有的应用程序都由Java语言编写。第16页/共159页ApplicationFramework应用程序开发人员在编写应用程序时可以完整的使用统一的API接口。这个应用程序框架是可以容易重复使用各种组件,这样应用程序就可以只需提供出它自己本身的特殊功能。应用程序还可以较容易的去使用其它程序的特殊功能。这种统一机制,有助于开发人员去编写自己新的软件组件,而不用编写一些已经存在的重复代码,提高开发效率。第17页/共159页ApplicationFramework组件(1)ViewsSystem(视图系统)(2)ContentProviders(内容提供器)
(3)ResourceManager(资源管理器)
(4)NotificationManager(通知管理器)
(5)ActivityManager(活动管理器)第18页/共159页ApplicationFramework组件(6)WindowManager(窗口管理器)
(7)LocationManager(定位管理器)
(8)TelephonyManager(电话管理器)
(9)PackageManager(包管理器)
(10)XMPPService:eXtensibleMessagingandPresenceProtocol第19页/共159页Libraries(1)SystemClibrary:一个由BSD衍生出来的标准C系统函数库(libc),这个函数库已针对Linux嵌入式设备进行过优化。(2)MediaLibraries:基于PacketVideo'sOpenCORE的多媒体函数库;这个多媒体函数库支持播放和录制许多现在很流行的声音及影像格式。比如:MPEG4,H.264,MP3,AAC,AMR,JPG及PNG。(3)SurfaceManager:这个部份让开发者可以去存取显示系统,以及无接缝的实现2D/3D多应用程序之间的整合。(4)LibWebCore:一个先进的网页浏览器引擎。(5)SGL:2D图形引擎库。第20页/共159页Libraries(6)3DLibraries:一个基于OpenGLES1.0规范的3D图像引擎库。它可以选择硬件的3D加速或高度优化的3D软件程序去实现效果。(7)FreeType:位图及矢量字形。(8)SQLite:SQLite是一套开放源码的关系数据库,供Android上所有的应用程序使用。其特点在于轻量型(仅500KB左右的大小),适合手持式设备使用;此外桌面型计算的应用程序也有使用,如OpenO2.0版之后就有内建的SQLite。(9)SSL-SecureSocketLayer,专门用于保护网页通讯的协议。第21页/共159页AndroidRuntimeAndroid虽然使用Java程序语言来开发、编写应用程序,但却不使用一般大家目前在用的JavaRuntime(J2ME)版本来执行Java程序,而是用Android自有的AndroidRuntime来执行。AndroidRuntime包含下面两个核心。(1)CoreLibraries(2)DalvikVirtualMachine第22页/共159页LinuxKernelAndroid平台的操作系统使用的是Linux,其核心版本为2.6版Android所用的Linux核心,包含的功能主要有:安全(Security)、内存管理(MemoryManagement)、进程管理(ProcessManagement)、网络堆栈(NetworkStack)、驱动程序模型(DriverModel)等另外在前述的软件堆栈与硬件间建立起一个抽象层(AbstractionLayer)。第23页/共159页1.3Android的应用程序组件ActivityServiceContentProviderBroadcastReceiver第24页/共159页第二章
Android开发环境搭建2.1下载并安装JDK2.2下载并安装SDK2.3下载并安装eclipse2.4下载并安装ADT第25页/共159页工具包关系Android的开发环境指用于开发Android应用程序所需要的基本的开发工具,主要包括四个部分,分别是JDK、eclipse、ADT及AndroidSDK。第26页/共159页2.1下载并安装JDK(1)下载最新的JDK,下载地址为:第27页/共159页2.1下载并安装JDK(2)安装JDK(3)配置JDK第28页/共159页2.1下载并安装JDK(4)测试JDK第29页/共159页2.2下载并安装SDK(1)下载AndroidSDK,我们可以到下载地址第30页/共159页2.2下载并安装SDK(2)安装AndroidSDK第31页/共159页2.2下载并安装SDK(3)下载AndroidSDK的其他组件第32页/共159页2.2下载并安装SDK(4)配置AndroidSDK第33页/共159页2.2下载并安装SDK(5)测试AndroidSDK的配置第34页/共159页2.3下载并安装eclipse(1)下载eclipse第35页/共159页2.3下载并安装eclipse(2)安装eclipse第36页/共159页2.4下载并安装ADTADT是Google为Android开发者提供的Eclipse插件,可以很方便的开发应用程序,下面我们来安装和安装ADT插件,步骤如下:(1)下载ADT。我可以在找到ADT的下载链接第37页/共159页2.4下载并安装ADT(2)安装ADT第38页/共159页2.4下载并安装ADT(3)配置ADT第39页/共159页第三章
HelloWorld应用程序3.1创建HelloWorld应用程序3.2应用程序结构分析3.3调试应用程序3.4导入已存在项目第40页/共159页3.1创建HelloWorld应用程序ADT提供了简单的生成Android应用框架的功能,我们现在使用ADT通过Eclipse创建一个Android工程。在创建工程之前,首先要有一个运行应用程序的环境,可以是真实的Android手机,也可以是模拟器。这里使用模拟器的方式,即使用AVD来运行我们的应用程序。第41页/共159页什么是AVD从Android1.5开始引入了AVD(AndroidVirtualDevice)这个概念。AVD是一个经过配置的模拟器。在创建AVD时可以配置的选项有:模拟器影像大小、触摸屏、轨迹球、摄像头、屏幕分辨率、键盘、GSM、GPS、Audio录放、SD卡支持、缓存区大小等。第42页/共159页创建AVD下面我们便来配置Android模拟器,具体步骤如下所示。(1)打开“AndroidSDKandAVDManager”第43页/共159页创建AVD(2)新建AVD第44页/共159页创建AVD(3)运行AVD第45页/共159页3.2应用程序结构分析“PackageExplorer”导航器中的“HelloWorld”项目第46页/共159页R.javaR.java是在建立项目时自动生成的,这个文件是只读模式,不能更改,R.java文件是定义该项目所有资源的索引文件。先来看看“HelloWorld”项目的R.java文件第47页/共159页AndroidManfest.xmlAndroidManfest.xml文件则包含了该项目中所使用的Activity、Service、Receiver,我们先来打开“HelloWorld”项目中的AndroidManfest.xml文件第48页/共159页String.xml资源文件中一些常量的定义第49页/共159页main.xml“HelloWorld”项目的布局文件(layout)第50页/共159页布局和参数LinearLayoutandroid:orientation:表示这个介质的版面配置方式是从上到下垂直地排列其内部的视图。android:orientation:表示这里是水平排列android:layout_width:定义当前视图在屏幕上所占的宽度,fill_parent即填充整个屏幕。android:layout_height:定义当前视图在屏幕上所占的高度,fill_parent即填充整个屏幕。wrap_content:随着文字栏位的不同而改变这个视图的宽度或高度。layout_weight:用于给一个线性布局中的多个视图的重要度赋值。第51页/共159页布局和参数TextViewandroid:layout_width为整个屏幕的宽度android:layout_height可以根据文字来改变高度android:text则设置了这个TextView要显示的文字内容,这里引用了@string中的hello字符串,即String.xml文件中的hello所代表的字符串资源。hello字符串的内容“HelloWorld,HelloWorld!”这就是我们在“HelloWorld”项目运行时看到的字符串。第52页/共159页HelloWorld.java主程序HelloWorld类继承自Activity类,重写了voidonCreate(BundlesavedInstanceState)方法。在onCreate方法中通过setContentView(R.layout.main)设置了Activity要显示的布局文件(\layout\main.xml)。第53页/共159页结构特点以上的应用程序结构是Android开发的特点,这样可以很轻松地将代码和UI(UserInterface,用户接口;用户界面)分开,在国际化和程序维护方面有着巨大的作用。如果Android程序需要自适应国际化,比如说多国语言等问题,那么就可以定义不同语言的UI布局,在程序装载时调用不同的布局。而且,如果需要修改UI的一些问题,就不必查看代码了,直接更改这些布局文件即可。当然,这需要开发者在开发时使用这种MVC框架,尽量减少使用“硬编码”。第54页/共159页3.3调试应用程序在eclipse开发工具中调试程序的方法很多,但是使用eclipse调试Android程序时需要注意一些细节上的问题。DDMS的使用断点的使用adb的使用第55页/共159页DDMS的使用在eclipse+ADT的开发环境中没有直接跟踪对象内容的方法,但是我们可以使用Google提供的ADT插件DDMS(DalvikDebugMonitorService)在eclipse上轻松地调试Android程序。DDMS为我们提供了许多功能,例如:测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息,LogCat,广播状态信息,模拟电话呼叫,接收SMS,虚拟地理坐标等等(1)切换到DDMS的方法(2)LogCat使用(3)FileExplorer使用第56页/共159页切换到DDMS的方法第57页/共159页切换到DDMS的方法在“DDMS”界面中选择“Devices”标签,查看其菜单的功能,我们可以看到DebugProcess(调试进程)、UpdateThreads(更新线程)、UpdateHeap(更新堆)、CauseGC(引起垃圾回收)、StopProcess(停止进程)、ScreenCapture(屏幕截图)、Resetadb(重启AndroidDebugBridge)菜单选项,如图51所示。Android程序运行时的各种状态,比如进程信息、线程分析、堆内存的占用,结束一个进等程。当然,这些操作都是在DDMS框架下进行的,日常开发的程序是无法执行调用的。如果adb调试桥运行不稳定,可以选择“resetadb”来重新启动“adb.exe”进程。第58页/共159页LogCat使用“LogCat”通过“android.util.Log”类的静态方法来查找错误和打印系统日志消息。它是一个进行日志输出的API,我们在Android程序中可以随时为某一个对象插入一个Log,然后在DDMS中观察LogCat的输出是否正常。android.util.Log常用的方法有以下5个:Log.v(Stringtag,Stringmsg);Log.d(Stringtag,Stringmsg);Log.i(Stringtag,Stringmsg);Log.w(Stringtag,Stringmsg);Log.e(Stringtag,Stringmsg);第59页/共159页LogCat使用这5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不同,我们可以控制要显示的某一类错误,一般我们如果使用“断点”方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息应当只存在于开发过程中,最终版本只可以包含Log.i,Log.w,Log.e这三种日志信息。第60页/共159页LogCat使用下面对“HelloWorld”程序进行调试,首先修改“HelloWorld.java”第61页/共159页LogCat使用点击“Run”→“Debug”菜单命令,进入调试模式第62页/共159页LogCat使用切换到“DDMS”界面,在“Devices”标签中选择项目运行的AVD,并点击“LogCat”标签第63页/共159页FileExplorer使用FileExplorer显示的是已经连接的AVD的文件及目录,通过FileExplorer可以向AVD上传文件或从AVD中下载文件的本地。下面介绍文件的上传方法。在“Devices”标签中选择已经运行的AVD,并选择“FileExplorer”,打开SD卡所在的目录,最后上传文件,第64页/共159页断点的使用在调试Android程序时,我们同样可以通过设置断点的方式来调试程序。在启动应用程序进行调试时,eclipse会自动切换到Debug透视图。毫无疑问,最常见的调试步骤是设置断点,这样可以检查条件语句或循环内的变量和值。要在Java透视图的PackageExplorer视图中设置断点,双击选择的源代码文件,在一个编辑器中打开它。遍历代码,将鼠标放在可疑代码一行的标记栏(在编辑器区域的左侧)上,双击即可设置断点。(2)点击“Run”→“Debug”菜单命令,切换到了“Debug”页面,这里可以对程序进行调试。第65页/共159页adb的使用Android调试桥(AndroidDebugBridge,adb)是多种用途的工具,该工具可以帮助我们管理设备(Android-powereddevice)或模拟器(emulatorinstance)的状态。Android调试系统是一个客户/服务器系统,包括三个组成部分。
●一个在你用于开发程序的电脑上运行的客户端。你可以通过shell端使用adb命令启动客户端。其他Android工具比如说ADT插件和DDMS同样可以产生adb客户端。
●在你用于发的机器上作为后台进程运行的服务器。该服务器负责管理客户端与运行于模拟器或设备上的adb守护程序(daemon)之间的通信。
●一个以后台进程的形式运行于模拟器或设备上的守护程序(daemon)。第66页/共159页(1)发出adb命令发出Android命令:可以在我们的开发机上的命令行或脚本上发布Android命令,使用方法:adb[-d|-e|-s<serialNumber>]<command>第67页/共159页(2)查询模拟器或设备实例在发出adb命令之前,有必要知道什么样的模拟器或设备实例与adb服务器是相连的。可以通过使用devices命令来得到一系列相关联的模拟器或设备:adbdevices作为回应,adb为每个实例都制定了相应的状态信息:第68页/共159页(3)给特定的模拟器或设备实例发送命令如果有多个模拟器或设备实例在运行,在发布adb命令时需要指定一个目标实例。这样做,需使用-s选项的命令。使用-s选项的格式是:adb-s<serialNumber><command>如上所示,给一个命令指定了目标实例,这个目标实例使用由adb分配的序列号。我们可以使用devices命令来获得运行着的模拟器或设备实例的序列号来运行命令,如图中所示,这个命令在emulator-5554上安装软件包ESFileExplorer.apk。第69页/共159页(4)安装软件我们可以使用adb从开发电脑上复制一个应用程序,并且将其安装在一个模拟器或设备实例。像这样做,使用install命令。这个install命令要求我们必须指定所要安装的.apk文件的路径:adbinstall<path_to_apk>第70页/共159页(5)卸载软件卸载软件使用uninstall命令,其使用格式如下:adbuninstall<package>这里的package为安装的软件的包名,这里以我们前面的HelloWorld项目为例,包名即为“org.myandroid.HelloWorld”,当运行程序使模拟器死机时,我们也可以使用uninstall命令来强行卸载这个应用程序。第71页/共159页(6)启动shell命令db提供了shell端,通过shell端你可以在模拟器或设备上运行各种命令。这些命令以2进制的形式保存在本地的模拟器或设备的文件系统中。不管我们是否完全进入到模拟器或设备的adb远程shell端,我们都能用shell命令来执行命令。当没有完全进入到远程shell的时候,这样使用shell命令来执行一条命令:adb[-d|-e|-s{<serialNumber>}]shell<shellCommand>进入模拟器或设备的远程shell端时,这样使用shell命令:adb[-d|-e|-s{<serialNumber>}]shell第72页/共159页(6)启动shell命令通过adb远程shell端,我们可以通过sqlite3命令程序来管理数据库。sqlite3工具包含了许多使用命令,比如:“.dump”:显示表的内容,“.schema”:可以显示出已经存在的表空间的SQLCREATE结果集。sqlite3还允许你远程执行SQL命令。第73页/共159页(7)关闭adbserver在某些情况下,我们可能需要终止Android调试系统的运行,然后再重新启动它。例如,如果Android调试系统不响应命令,我们可以先终止服务器然后再重启,这样就可能解决这个问题,用kill-server可以终止adbserver。可以用adb发出的任何命令来重新启动服务器。kill-server命令的使用格式如下:adbkill-server第74页/共159页3.4导入已存在项目在安装了Android开发环境之后,可以直接将Android项目导入到eclipse中。启动eclipse,选择“File”→“Import…”菜单,展开“General”项,选择“ExistingProjectsintoWorkspace”导入项目到工作空间。第75页/共159页3.4导入已存在项目然后点击“Next”按钮,进入选择项目文件目录,选择好项目目录后,点击“Finish”按钮,等待导入项目完成。如果需要将项目文件一起拷贝到工作空间,就需要选择“Copyprojectsintoworkspace”复选框。第76页/共159页第四章
Android用户界面开发4.1用户界面开发简介4.2单个Activity的用户界面示例4.3多个Activity的用户界面示例第77页/共159页4.1用户界面开发简介Android的用户界面可以有两种实现方式:使用XML或者是使用Java代码。通过直接书写代码的方式来实现界面是比较麻烦的事情。举个例子来说,如果我们有DHTML的经验,那么这两者的区别可以比喻为:用XML来实现用户界面就像直接写HTML代码,而用Java代码来实现用户界面就像用JavaScript创建DOM对象来拼接页面。所以,使用XML来布局界面应该是首选。第78页/共159页XML布局Android使用一个XML文件来定义用户界面。为了方便理解,我们可以直接把它理解为一个HTML文件。事实上,它也确实比较像一个HTML文件。第79页/共159页XML布局这里面有一个比较重要的类叫做ViewGroup,这个XML的root节点必须是一个ViewGroup,或者是一个单一的Widget(整个XML只有一个元素)。Android几乎所有的UI似乎都和ViewGroup有或多或少的关系。但是它只是一个abstractclass,并不能直接使用,我们能用的,是它的一些子类,例如:AbsoluteLayout、FrameLayout、LinearLayout、RelativeLayout、TableLayout等,第80页/共159页XML布局AbsoluteLayout:绝对定位的布局方式,在它内部嵌套的元素必须指定具体的位置。FrameLayout:帧布局方式,说帧不太容易理解,可以说成是层布局方式,也就是说,在它内部的元素,是一层一层的叠加在一起的。如果用过Photoshop,或者Flash,这里面的层的概念是和他们一致的。如果最上层的元素是不透明的,并且比下面的元素尺寸要大,那么将看不到下面的元素,只能看到顶层元素。这些层的顺序是:最新声明的放到最前面。可以这样理解,Android按文件的书写顺序来组织这个布局,先声明的放在第一层,再声明的放到第二层,…,最后声明的放在最顶层。第81页/共159页XML布局LinearLayout:线性布局方式,这种布局比较常用,也比较简单,就是每个元素占一行,当然也可能声明为横向排放,也就是每个元素占一列。RelativeLayout:相对定位的布局方式,在定位元素的位置的时候,使用相对位置,可以相对其他元素,也可以相对这个布局。就像是说:我现在站在A和B的中间;或者说,我站在队伍的中间。前者就是相对其他元素来定义位置,后者是相对整个布局来定义位置。TableLayout:表格的布局方式,这里面的Table和HTML中的Table类似。第82页/共159页XML布局从上面这几个类从名字就可看的出来,他们是Layout,也就是布局。如果用过HTML,那么每一个Layout,可以理解为有了特定排版样式的DIV。在DIV的内部,可以放置其他的DIV,当然也可以放置最底层的元素,比如说文本、文本框、单选按钮、图片等等。这里面所说的最底层的元素,它们有一个超类叫做View,同时ViewGroup也是它的子类。ViewGroup就是能容纳其他View的View。第83页/共159页ViewGroup和View总结(1)ViewGroupViewGroup是一个android.view.ViewGroup(android.view.View的子类)类的对象,顾名思义,ViewGroup是一个特殊的View对象,他的功能是装载和管理一组下层的View和其他的ViewGroup,ViewGroup可以为UI增加结构,并且将复杂的屏幕元素构成一个独立的实体。作为一个基类,ViewGroup为Layout(布局)服务,Layout则是一组提供屏幕界面通用类型的完全实现子类。Layout可以为一组View构建一个结构。第84页/共159页ViewGroup和View总结(2)View任何一个View对象都将继承android.view.View类。它是一个存储有屏幕上特定的一个矩形布局和内容属性的数据结构。一个View对象可以处理测距、布局、绘图、焦点变换、滚动条,以及屏幕区域自己表现的按键和手势。View类为Widget服务,Widget则是一组用于绘制交互屏幕元素的完全实现子类。Widget处理自己的测距和绘图,所以可以快速地用它们素构建UI。可用到的Widget包括TextView、EditText、Button、RadioButton、CheckBox和ScrollView等。第85页/共159页XML布局总结(1)这个XML文件是由许多View嵌套组成的。(2)如果布局中有多个元素,那么最顶层必须是ViewGroup(一个ViewGroup对象同时也是一个View对象),不可以是View,如果整个布局只有一个元素,那么最顶层元素就是这个唯一的元素。(3)在ViewGroup可以内部嵌套View(既然可以嵌套View,就更可以嵌套ViewGroup了)(4)在View中,不可嵌套其他东西了,要不然它就是ViewGroup了,就是这么定义的。第86页/共159页HelloWorld应用程序用户界面分析这里将针对上一章创建的“HelloWorld”项目,对其用户界面作简要介绍。main.xmlR.javaHelloWorld.java第87页/共159页main.xmlmain.xml源码详细解释如下,这里每一种元素可以定义属性有很多,并且这些属性都可以和HTML的css中的属性来类比。(1)首先,定义了一个LinearLayout,前面说过,这个布局要么将子元素水平排列,要么将它们竖直排列。(2)然后,定义了一个TextView,一个TextView,就是一块区域,用来显示文本,用这个View定义的元素只能用来显示,是不可以编辑的,如果想要可编辑的文本块,那么应该使用它的子类EditText。第88页/共159页R.java这里涉及到了一些资源文件,直观的说,就是res目录下的那些目录和文件,常用的有:●res/drawable/:用来存放图片文件●res/layout/:用来存放布局定义文件●res/values/:用来存放一些变量、参数等文件第89页/共159页R.java这里涉及到了一些资源文件,直观的说,就是res目录下的那些目录和文件,常用的有:●res/drawable/:用来存放图片文件●res/layout/:用来存放布局定义文件●res/values/:用来存放一些变量、参数等文件这些资源文件都是独立于代码而存在的,在代码中要访问到这些资源需使用R.java文件。在Android的代码中,有一个文件比较奇怪,这个文件就是R.java,在R.java的注释部分,有这样一段话:“AUTO-GENERATEFILE.DONOTMODIFY”,这个文件是自动生成的,不要修改。第90页/共159页R.java●
这个文件就是Java代码和独立于Java代码的资源文件之间的访问窗口,Java程序可以通过R.java来访问那些资源文件。●这个文件是在程序编译过程中由aapt(AndroidAssetPackagingTool)自动生成●这个文件中的属性都是publicstaticfinal的,所以可以直接在Java代码中引用,每个属性都代表一个资源,看起来就像为每个资源都定义了一个ID,然后通过这个ID来访问资源●所有的资源文件都被编译进最后生成的二进制包中,这样能够带来很高的性能和效率第91页/共159页HelloWorld.java接下来再看一下,如何在Java代码中使用这个R.java。第92页/共159页HelloWorld.java这其中的R.layout.main,通过setContextView(),被Java程序调用。这段代码中引入了另外一个非常重要的概念:Activity。如果套用MVC来理解的话:ViewGroup和View属于View领域的东西,Activity可以理解为Control领域的东西,虽然可以这么类比着来理解,但是Activity其实做了更多的事情,由它将View和一些数据、操作等结合在一起,完成一个相对完整的行为、活动。所以,任何View要被显示,必须通过Activity来进行。这样每个Activity都会包含特定的行为,多个Activity互相合作,最终组成一个完整的Android程序。在示例的Activity中,有一个onCreate()方法,这个方法会在此Activity被创建的时刻调用。在方法内部,设置此Activity的视图为R.layout.main中定义的视图,也就是res/layout/main.xml中定义的视图(视图、布局、GUI、UI意义相同,可统一用View表示)。第93页/共159页4.2单个Activity的用户界面示例一个简单的和用户交互的示例,这个程序的需求是:
●画面上有三行元素,第一行是一个TextView,用来显示文字●第二行是一个EditText,用户将在此输入文字●第三行是一个Button●用户点击Button之后,会在第一行的TextView中显示:Hello,(用户在第二行中输入的文字)。比如说用户在输入框中输入:“UI”,那么点击Button之后,会在显示区域显示:“Hello,UI”。第94页/共159页4.2单个Activity的用户界面示例要完成这个程序,首先是创建一个Android项目,这个默认创建的项目实际就是一个最基本的“HelloWorld”项目,但此时新建的项目名字命名为“HelloOneActivity”,然后是在此基础上修改与完善项目,这里大概需要用5步:第95页/共159页UI的设计(1)先完成UI的设计,修改在res/layout/目录下的main.xml的文件第96页/共159页UI的设计这里解释一下这几个语句:●android:id=”@+id/textview_display”这个是用来为当前的View声明一个ID,这样,在Java程序中就可以通过这个ID来找到这个元素,进而能够操作这个元素。●android:textSize=”20px”声明字体大小为20px,对于每种View,都会有一系列的可以设置的属性,具体的属性可参考每个View的说明文档。第97页/共159页声明资源(2)创建好这个布局文件之后,再把这个文件需要的android:text=”@string/sayhello”在res/values/strings.xml中声明一下。这时已经可以运行一下这个Activity,看看最终显示的效果是否和预期的一致,如果有差别,可再调整一下。第98页/共159页修改交互动作第3步,现在,UI已经设计好了,修改ADT自动创建的Activity,其名字为:HelloOneActivity.java,用这个Activity来显示这个UI。第99页/共159页修改交互动作这里面有些语句需要解释:●Buttonbutton=(Button)findViewById(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(newView.OnClickListener())现在的GUI程序,好像都喜欢事件驱动的模型,有人这样描述过GUI系统本质:在事件驱动下动态地展现数据模型的图形系统。在这个语句中,setOnClickListener就是为button添加一个事件监听,监听OnClick事件,也就是说,如果一旦触发button的OnClick事件,就会执行后面定义的功能。第100页/共159页运行程序接口(4)运行程序第101页/共159页4.3多个Activity的用户界面示例这里将解释如何创建多个Activity的用户界面,以及了解Activity的生命周期。这个多Activity的示例程序的功能大概是这样的:●在主页面上有三个元素:一个文本输入框,两个按钮。用户可以在文本框中输入一些字符●点击第一个按钮,将弹出一个对话框形式的Activity,显示”Hello,…”●如果点击的是第二个按钮,将显示另一个全屏的Activity,显示”Hello,…”第102页/共159页4.3多个Activity的用户界面示例(1)创建项目。这里,项目的名字为“HelloThreeActivity”,应用程序的名字为“ActivityLifecycle”,包名为“org.myandroid.HelloThreeActivity”,默认创建的Activity的名字为“ActivityLifecycle”。第103页/共159页4.3多个Activity的用户界面示例(2)先完成UI的设计,创建布局。从程序来看,似乎有三个Activity,但是第二个和第三个几乎是相同的,于是,只创建两个布局。第104页/共159页main.xml内容第105页/共159页dialog.xml内容丰富第106页/共159页4.3多个Activity的用户界面示例(3)然后,需要把上面提到的字符变量声明一下,修改res/values/strings.xml第107页/共159页4.3多个Activity的用户界面示例(4)创建Activity,需要定义三个Activity:分别将他们定义为:ActivityLifecycle(用来显示主画面)、AlertDialog(用来显示对话框)和AlertActivity(用来显示那个全屏的Activity)。(5)编辑AndroidManifest.xml,这个文件像一个户口簿一样记录每一个Activity的信息,Android系统会通过这个文件得到:执行这个程序的时候,启动的是那个Activity等信息。不仅如此,这个还包括Intent、Provider等其他一些信息。(6)这时就可以运行程序了。第108页/共159页生命周期的详细说明●如果一个Activity显示在最前端,它的状态是active或者是running●如果一个Activity失去焦点,但是还能在屏幕上看到它,比如说,被一个非全屏的或者是透明的另一个Activity遮盖,它此时的状态是paused。一个处于paused状态的Activity,保持着所有自身的状态和信息,秉持着与windowmanager的联系,但是当系统内存不足时,可能会被系统终止●如果一个Activity完全看不见了,被其他的Activity完全挡住,它的状态变成stopped。处于stopped的Activity虽然也保留着如同paused状态一样的特性,但是此时的它更容易被系统终止●如果一个Activity处于paused或者stopped状态时,系统可以通过要求Activity结束或者强制kill的方式从内存中删除这个Activity,当它在此需要显示时,就需要restart和重新加载以前的数据,可见,适时的保存数据的重要性第109页/共159页Android应用的生命周期第110页/共159页第五章
Android数据存储开发5.1SharedPreferences5.2Files5.3SQLite5.4Network5.5ContentProvider第111页/共159页数据存储开发概述在Android中,可供选择的存储方式主要有5种,分别是SharedPreferences、Files(文件)、SQLite(SQLite数据库)、Network(网络)和ContentProvider(内容提供器)。●SharedPreferences,类似于我们常用的ini文件,用来保存应用程序的一些属性设置,在Android平台常用于存储较简单的参数设置。数据存放在目录:/data/data/<packagename>/shared_prefs/中,存储成XML格式的文件。我们无法在多个应用程序间共享Preferences数据。●Files(文件存取I/O),文件用来存储大数量的数据采用java.io.*库所提供有I/O接口,读写文件。只有本地文件可以被访问。优点是可以存储大容量的数据,其缺点是文件更新或是格式改变可能会导致巨大的编程工作。第112页/共159页数据存储开发概述●
SQLite(SQLite数据库),SQLite是一个开源的轻量级关系型数据库,具有ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的特性。其体积大小只用几千字节,部分的支持一些SQL的指令,例如:ALTER、TABLE等。Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。●Network(网络),Android还提供了网络存储数据的方式,需要要使用两个包:.*和.*。其实就是与网络服务器取得联系,将数据存放于网络服务器上或从网络服务器读取数据。第113页/共159页数据存储开发概述●ContentProvider,ContentProvider是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享。Android为常见的一些数据提供了ContentProvider(包括音频、视频、图片和通讯录)。每个ContentProvider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用ContentProvider为这些数据定义一个URI,然后其他的应用程序就可以通过ContentProvider传入这个URI来对数据进行操作。URI由3个部分组成:"content://"、数据的路径、标识ID(可选)。第114页/共159页5.1SharedPreferences首先介绍的是SharedPreferences,它是Android提供用来存储一些简单的配置信息的一种机制,例如,一些默认欢迎语、登录的用户名和密码等。其以键值对的方式存储,使得我们可以很方便的读取和存入,下面是一个示例,其功能是保存文本框中的数据,这里的用户名和密码。(1)新建Android项目“HelloSharedPreferences”。(2)修改其布局文件main.xml。在一个LinearLayout当中放3个TextView和两个EditView组件。第115页/共159页5.1SharedPreferences(3)修改HelloSharedPreferences.java,使得应用程序退出时,自动保存上面文件框中的内容。在onCreate中使用findViewById得到两个EditView后,使用getSharedPreferences取得SharedPreferences对象settings,然后使用getString取得其中保存的值,最后使用setText将其值设置为两个EditText的值。而在程序运行onStop过程,也就是在程序退出时,首先使用getSharedPreferences得到settings;然后调用edit()方法使其处于可以编辑状态,并使用putString将两个EditText中的值保存起来;最后使用commit()方法提交即可保存。第116页/共159页5.1SharedPreferences(4)运行程序。第117页/共159页5.2Files和传统的Java中实现I/O的程序类似,在Android中,其提供了openFileInput和openFileOuput方法读取设备上的文件,下面是一个示例程序,其功能是将文本框中输入的内容存入在文件中去。(1)创建“HelloFiles”项目。(2)修改布局文件main.xml。(3)在strings.xml中增加上面用的资源。(4)最后就是增加按钮按下时,把文本框中的内容存入文件test.txt中的处理事件,在HelloFiles.java中增加内容。第118页/共159页5.2Files(5)运行程序,当点下“Savetofile”时,可在Android系统中的“/data/data/PACKAGE_NAME/files”目录下看到应用程序创建的text.txt文件。第119页/共159页5.3SQLiteSQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。这里以一个示例来说明在Android中对数据库操作过程,在这个例子中,主要的内容有如何新建一个数据库;如何新建数据库里边的数据表;如何删除数据库里边的数据表;如何在数据表中添加新数据;如何删除数据库表中的数据等。第120页/共159页5.3SQLite在进行数据库开发之前,需要了解什么是SQLiteDatabase及SQLiteOpenHelper。●SQLiteDatabase,一个SQLiteDatabase的实例代表了一个SQLite的数据库,通过SQLiteDatabase实例的一些方法,我们可以执行SQL语句,对数据库进行增、删、查、改的操作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。第121页/共159页5.3SQLite●SQLiteOpenHelper,根据这名字,我们可以看出这个类是一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。SQLiteOpenHelper是一个抽象类,我们通常需要继承它,并且实现里边的3个函数,具体函数如下所示。◆onCreate(SQLiteDatabase):在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表。◆onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。◆onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。第122页/共159页5.3SQLite(1)创建项目“HelloSQLite”项目。(2)修改布局文件main.xml这个界面的布局信息都在main.xml文件中,在一个LinearLayout当中数值排列了5个Button,对应功能可参见项目表代码。(3)我们在HelloSQLite.java文件中看到内部类DatabaseHelper。DatabaseHelper类继承SQLiteOpenHelper,并且重写了onCreate和onUpgrade方法。在onCreate()方法里边首先我们构造一条SQL语句,然后调用db.execSQL(sql)执行SQL语句。这条SQL语句为我们生成了一张数据库表。目前我们还不需要升级数据库,所以我们在onUpgrade()函数里边没有执行任何操作。第123页/共159页5.3SQLite(4)插入记录操作。我们单击插入两条记录的按钮,如果数据成功插入到数据库当中的diary表中,那么在界面的title区域就会有成功的提示。单击“插入两条记录”按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的insertItem方法。(5)查询记录。单击“查询数据库”的按钮,会在界面的title区域显示当前数据表当中数据的条数。单击这个按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的showItems方法,第124页/共159页5.3SQLite(6)删除记录。单击“删除一条记录”的按钮后,如果成功删除,我们可以看到在屏幕的标题(title)区域有文字提示。单击删除一条记录的按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的deleteItem方法。(7)删除数据表。单击“删除数据表”,我们可以删除diary这张数据表。(8)重新建立数据表。第125页/共159页5.3SQLite(9)完成整个应用程序的编写,并运行程序。第126页/共159页5.4Network前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取,下面看一个在Android上调用WebService的例子。(1)功能说明,通过邮政编码查询该地区的天气预报,以POST发送的方式发送请求到站点,访问WebS站点上提供查询天气预报的服务,具体信息请参考其WSDL文档,网址为:/WeatherForecast.asmx?WSDL。输入:美国某个城市的邮政编码。输出:该邮政编码对应城市的天气预报。第127页/共159页5.4Network(2)实现过程将分以下几步完成,首先是建立一个Android项目,由于需要访问外部网络,创建完项目后,需要在AndroidManifest.xml文件中加入如下代码申请权限许可。(3)实现网络应用,这里只是简单的运行程序,然后在LogCat中返回结果。以HTTPPOST的方式发送(这里的SERVER_URL并不是指WSDL的URL,而是服务本身的URL)。第128页/共159页5.4Network(4)运行程序,从LogCat中查看运行结果。第129页/共159页5.5ContentProviderAndroid这个系统和其他的操作系统还不太一样,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。为了能使两个程序之间能够进行数据进行的交换,解决的办法主要靠ContentProvider。ContentProviderContentResolverUri第130页/共159页ContentProvider一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。也就是说,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据。第131页/共159页ContentProviderContentProvider常见接口query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通过Uri进行查询,返回一个Cursor。insert(Uriurl,ContentValuesvalues):将一组数据插入到Uri指定的地方。update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的数据。delete(Uriurl,Stringwhere,String[]selectionArgs):删除指定Uri并且符合一定条件的数据。第132页/共159页ContentResolver外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通过Uri进行查询,返回一个Cursor。insert(Uriurl,ContentValuesvalues):将一组数据插入到Uri指定的地方。update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的数据。delete(Uriurl,Stringwhere,String[]selectionArgs):删除指定Uri并且符合一定条件的数据。第133页/共159页Uri在ContentProvider和ContentResolver当中用到了Uri的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的数据。我们看下面的例子。content://contacts/people/ 这个Uri指定的就是全部的联系人数据。content://contacts/people/1 这个Uri指定的是ID为1的联系人的数据。第134页/共159页Uri在上边两个类中用到的Uri一般由3部分组成。第一部分是:"content://"。第二部分是:要获得数据的一个字符串片段。最后就是:ID(如果没有指定ID,那
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国仪表配套拨盘旋钮行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2024-2025学年福建省龙岩市一级校联盟高二下学期期中政治试题及答案
- 珠宝培训师的课件
- 2022-2027年中国县域电商行业发展监测及发展战略规划报告
- 污水处理开题报告书
- 2025年 湖州南浔区教育局中小学储备教师招聘考试笔试试题附答案
- 2025年 非高危行业安全生产管理能力考试练习题附答案
- 中国太平柜行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 化工程学院081100控制科学与工程报录数据分析报告初试+
- 中国电动工具行业市场全景监测及投资前景展望报告
- 肿瘤科护理疑难病例讨论
- 建设项目全过程工程咨询服务投标方案
- GB/T 41782.3-2024物联网系统互操作性第3部分:语义互操作性
- 人音版音乐二年级下册第4课聆听《吉祥三宝》教学设计
- 工程项目尾款结算协议
- DL∕T 1739-2017 静力水准装置
- 2023七年级数学下册 第四章 三角形3 探索三角形全等的条件第1课时 利用边边边判定三角形全等教案 (新版)北师大版
- 2023北京经济技术开发区招考社区工作者75人笔试历年典型考题及考点剖析附答案带详解
- 项目重点难点分析及应对措施
- 剑桥KET词汇表(中英对照)
- 教科版小学科学五年级下册知识点归纳总结
评论
0/150
提交评论