android入门到精通详解第一篇Android系统结构和SDK使用_第1页
android入门到精通详解第一篇Android系统结构和SDK使用_第2页
android入门到精通详解第一篇Android系统结构和SDK使用_第3页
android入门到精通详解第一篇Android系统结构和SDK使用_第4页
android入门到精通详解第一篇Android系统结构和SDK使用_第5页
已阅读5页,还剩203页未读 继续免费阅读

下载本文档

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

文档简介

目第一篇Android系统结构和SDK使 第1章Android的系统介 第2章AndroidSDK的开发环 AndroidSDK的结 AndroidSDK环境安 Android中建立工 第二篇Android应用程序的概述和框 API参考文档的使 第4章Android应用程序示 第5章Android应用程序的内 使用am工具启动Android应用程 第三篇Android的UI系统实 第6章UI的基本外形和控 弹出 第7章控件(Widget)的使 网格(Grid)视图 列表(List)视图 使用Tab组织 第9章2D图形接口的使 第10章OpenGL3D图形的使 使用OpenGL图形接口的程序结构 第一Android系统结构SDK使用1章Android的系统介绍 系统介Android是开发的基于Linux平台的、开源的、智能操作系统。Android包括操作系统、中间件和应用程序,由于源代码开放,Android可以被移OHA(OpenHandsetAlliance,开放),为与33家公司联手为Android移动平台系统的发展而组建的。厂商也推出了几款Android,如下图所示:G1、G2、HeroNexusOne围绕在的Android系统中,形成了移植开发和上层应用程序开发两个不同的开发方面。厂商从事移植开发工作,上层的应用程序开发可以由任何Android1.5以前的仿真环境,Android1.6以后的仿真器环境如下Android1.5Android1.6作为一个平台,Android在技术上的优势主要有以下几点完善SDK和文提供了丰富的文档、资料。这Android系统的开发和运行在一个良好的软件结构和使用的工从宏观的角度来看,Android是一个开放的软件系统,它包含了众多的源代码。从下至上,Android系统分成4个层次:3层次:JavaAndroid系统的架构如图所示第四层:Java应用系系统第三层:Java框C/C++C/C++<-->第二层:本地框架和Java运行环<-->用户空第一层:Linux操作系统及驱Android次主要由Java代码实现。1层次和2层次之间Linux操作系统的角度来来看,是内核空间与用户空间的分界线,第1层次运行于内核空间,第2、3、4层次运行于用户空间2层次和第3层次之间,是本地代码层和Java代码层的用程序的开发,第3层次以下的内容是不可见的,仅考虑系统API即可。环境(Runtime),由虚拟机和Java基本类组成。除了软件本身的代码之外,Android还提供了一系列工具来辅助这些主要的工具包括也可用于将资源编译到二进制的assets。用它把Android模拟器或设备上的应用程序代码和一个标准的调试器连接android工具:android工具是一个,用于创建和管理AndroidVirtualDevices(AVDs。AIDL工具(AndroidInterfaceDescriptionLanguage,Android接口描述语言,AIDL线程信息,截取模拟器或设备的屏幕画面,还有的功能。dx:dx工具用于将.class字节码(bytecode)Android字节码(保存在.dex文件中)这个字节码文件是给Android的Java虚拟机运行用的。Draw9-patch:Draw9-patch工具允许使用所见即所得(WYSIWYG)的编辑器轻松地创建NinePatch图形。来模拟一个实际的Android系统的运行,使用模拟器非常适合调试和测试应image(click(touch(geues3:3工具能够方便地数据文件,这是一个标准命Traceview:这个工具可以将Android应用程序产生的日志(tracelog)2AndroidSDK的开发环 AndroidSDKAndroidSDKAndroidAndroid的SDK开发环境使用预编译的内核和文件系统,了Android软AndroidSDK插AndroidSDK在IDE环境中使用的组织结构如图插运行仿运行仿工文示例代底层映开发环本机JAVA工AndroidIDE(,在Android开发者的上可以直接各个版本的SDK。AndroidSDKandroid-sdk-{主机系统}_{体系结构}_{版本例如,Android提供SDK的几个文件包如下所示android-sdk-windows-android-sdk-linux_x86-android-sdk-windows-android-sdk-linux_x86-SDK add-ons:附加的包platforms中包含了AndroidSDK版本的中,包含系统映像,工data/images/:包含默认的Android磁盘映像,包括了系统映像(Androidsystemsamples/Android的开发环境中,根据它skins/tools/:特定平台的工具;Anydevelopmenttoolsthatarespecifictotheplatformversion.APIAndroid2Android3Android4Android5Android6Android7APIAndroid2Android3Android4Android5Android6Android7Eclipse集成环境的一个插件。Eclipse集成环境功能,使得生成和调试Android应用程序既容易又快速。AndroidSDK环境安AndroidSDKWindows版本需要以下的Eclipse集成开发环Android其中ADT和AndroidSDK可以到Android开发者的去,或者安装亦可,ADT的功能如下所示:可以从EclipseIDE内部其他的Android开发工具。例如,ADT可以让你直接从EclipseDDMS工具的很多功能——屏幕截图、管理端口转发forardingWizard新Android应用程序所需的最基本文件编写有效的XMLEclipse环境中使用AndroidSDKJDKJava环境 EclipseEclipseEclipse可以使用,但是没有得到Android的验证。如果使用Eclipse3.4,可以去eclipse-SDK-3.4-win32.zip包;如果使用Eclipse3.5,可以去eclipse-SDK-3.5.1-win32.zip包。这个包不需要安装,直接解压缩即可,解压缩后执行其中的eclipse.exe文件。Android工具和文档等。得到AndroidSDK,可能使用到两种方式:AndroidSDK的包AndroidSDK的包AndroidSDK1.6之前的版本AndroidSDK,AndroidSDK1.5,AndroidSDK1.6可以直接从Android开发者中得到,每个SDK包含Linux、Windows和MAC三个版本。在Windows环境中,使用 的版本,例如:android-sdk-windows-1.5_r2.zip android-sdk-windows-1.6_r1.zip,这个包通常用几百M的大小。目前Android系统推荐使用的方式软件升级获得Android包第一步:获得android-sdk_r04-从Android开发者上,获取AndroidSDK的相关包android-sdk_r04-windows.zip,这个包比实际的Android的SDK要小得多,只有20多M,其中包含了一个Setup可执行程序,获取完整的SDK是通过这个可执行程序获得的。解压缩这个包,获得AndroidSDK的基本 第二步:运行SDKSetup.exe程序,实际的Android运行程序,AndroidSDK的,出现SDK的界面AndroidSDKApply接受全部(AcceptAll)表示安装所有的内容。文档一般安装成的版本。选择后,安装程序将依次安装各个组过程中,每个组件将首先被放置到temp中,以一zip包的形式存在。完成后,得到完整的AndroidSDK。2.2.4(1).Eclipse3.4(Ganymede)中第一步:启动Eclipse选择“Help”>“SoftwareUpdates...”准备安装插Eclipse3.4框框Eclipse3.4点击右侧自上而下的第3个按钮,“AddSite...”准备在“AddSite”框中,输入Android插件的路径 另外的式是点击Archive„按钮,这样可以不使用网络,直接指定磁盘中的ADT包(目前的版本是ADT-0.9.5.zip)。Tools选择到“DeveloperTools”中,Eclipse3.4AndroidDDMS然后点击“Install...”按钮,继续运行,如图所示Eclipse3.4AndroidDDMSNext将出现框Eclipse3.4Android选择接受(accept)并且Finish完成安装之前的配置,后面的将进入安装的Android组件的阶段。安装的过程要经过寻找依赖和安装两个阶段,如图所示Eclipse3.4现ADT已经被安装。2.2.4(2).Eclipse3.5(Galileo)中件Eclipse3.5第二第二步:出现软件升级框图Eclipse3.5的软件升级 点击右侧自上而下的第3个按钮,“AddSite...”准备Eclipse3.5ADT在“AddSite”框中,输入Android插件的路径 另外的式是点击Archive„按钮,这样可以不使用网络,直接指定磁盘中的ADT包(的版本是ADT-0.9.5.zip)。第四步:回到软件升级框,workwith的路径变为了 /android/eclipse/,后面的列表变为了“DeveloperTools”,AndroidAndroidDevelopmentEclipse3.5AndroidDDMS选中后,点击Finish将出现安装的详细信息的框,如图所示Eclipse3.5Android选择Next进行下一Eclipse3.5Android选择接受(accept)并且Finish完成安装之前的配置,后面的将进入安装的Android组件的阶段。安装的过程如图所示:Eclipse3.5Android现ADT已经被安装。2.2.5.Eclipse中配Android进入ADTEclipse环境后,选择“Window”>“Preference”,从左侧的列表中选择Android项:EclipseAndroidSDK左侧的Android选项是由于安装了AndroidSDK而出现的SDK设置SDKLocation中,点击“Browse”„按钮;选择 ,点击“OK”按钮 中运行仿真器环Android虚拟设为了运行一个Android仿真器的环境,首先需要建立Android虚拟设出现“AndroidSDKandAVDDeviceManager”窗口,界面如图所示:AndroidSDKAVD的情况下点击右侧的New选择建立一个虚拟设备。建立新的Android虚拟设备的窗口为CreatenewAVD,如Android虚拟设备的建立包含了以下的一些选项(Name(argetSDSDSD卡映像文件,SD卡映像文件是使用mksdcard工具建立的。皮肤(Skin):这里皮肤的含义其实是仿真器运行尺寸的大小,默认的尺寸有P(320x480,HVGA-运行虚拟在“AndroidSDKandAVDDeviceManager”窗口中,选择一个设备,点击除了使用右侧的模拟键盘之外,也可以使PC机的键盘来进行模拟真实设按键之间的映射关系如下表所示仿真器的虚拟按 键盘的按 F2orupStar(右软按键 Shift-F2orPage Call/dial Hangup/endcall Power Audiovolumeup KEYPAD_PLUS,Ctrl-Audiovolumedown KEYPAD_MINUS,Ctrl-Camera Ctrl-KEYPAD_5,Ctrl-

KEYPAD_7,Ctrl-KEYPAD_9,Ctrl- 切换Code 临时进 DPad DPadcenter Onionalpha的增加和减少 Android仿真器启动虚拟设备之后,默认就可以使用主机的网络作为自己的网络、使用主机的音频设备作为自己输出。Android中的工在仿真器环境中,可以使用集成的Android相关工具。使用的方法是WindowShowViewOther选项,可以开Android的各个工具。调用的过程选择Android工具的框如图所示 控制)、FileExplore(文件浏览)、Heap(堆内存)、Logcat、ResourceLogcat实际上是一个运行在目标系统的工具,也就是一个Linux令行程序,这是界面种是带有GUI的效果。Logcat的窗口中记录的信息也就是实际的(tag)、Log内容(Message)等项目。Logcat窗口可以设置Log的过滤器(Filter),这样可以仅仅获得自己需要Log信息,其他的信息命令行程序logcat,位于目标文件系统中该工具位于system/bin中Logcat的使用方法如下所示##logcat[options]logcat工具的选项如下所 -f 输出到文件,在默认情况下是标准输-r -n 设置循环log的最大数目,默认为-v<format>log的打印格式,<format>是下面的briefprocesstagthreadrawtimethreadtime 清除所有log并退 得到所有log并退出(不阻塞- 得到环形缓冲区的大小并-b 请求不同的环形缓冲区('main'(默认)、'radio'、-Blog输出到二使用仿真器控选择EmulatorControl选项可以开启仿真器的控制框,它的界面如下示Android它甚至可以模拟打,发的过程。例如在 ingnumber中输入电话号码,然后点击Call按钮。这是仿真器的运行界面如图所示:Android接受的程序已经被调用起来,这里显示的1-234-56,也是在仿模 的界面显示如下所示Android命令行工adb、mksdcard有一Android的工具需要在命令行的环境中运行,只是可以选择Windows的开始->运行,键入cmd并确定,进入命令行的界面中运行。主要令行工具adbmksdcard等。命令行的工具AndroidSDKtools中,使用命adb(AndroidDebugBridge,Android调试桥)是Android的主要调试工具,将出现s提示符,这就是Android所运行的Linux系统中的s终端,可以在这个s提示符后执行Android系统提供的Linux命令。lsAndroid系统根:#ls-drwxrwxrwt 2009-06-1502:17drwxrwx 2009-06-1502:18 2009-06-1502:17lrwxrwxrwx2009-06-1502:17etc->drwxr-xr-x2009-05-2802:16drwxr-xr-x1970-01-0100:00drwxr-x1970-01-0100:00dr-xr-xr-x1970-01-0100:00-rwxr-x90751970-01-0100:00-rwxr-x16771970-01-0100:00-rwxr-x1065681970-01-0100:00-rw-r--r--1181970-01-0100:00drwxrwx--x2009-05-2802:49 1970-01-0100:00drwxr-xr-x2009-06-1502:18Android根中的主要文件夹与目标系统的out/target/product/generic/root内容相对应,此etc、proc等Android启动后自动建立的,system映像被挂接到根文件系system中,data映像被挂接到根文件系统data中1174032811740328c003aa1cafe0d08cS808264c01654b4afe0c45cS111546bluetooth547174041168 548 c008e3f4afe0c584S/system/bin/voldc0192c20afe0cdecS/system/bin/debuggerdffffffffafe0caccS/system/bin/rildc008e3f4afe0c584Sffffffffafe0c45cS/system/bin/mediaserverc008de04afe0d25cS/system/bin/dbus-daemonc01f3b04afe0c1bcS/system/bin/installdapp_46455459719212964ffffffffafe0d3e4S#psPPIDVSIZERSS 1 280188c008de040000c74cS2000S3200S4200S5200S200S200S200S200S200S200S200S200S200S200S200S1 c00ae7b0afe0d1dcS1 ffffffff0000e8f4Sffffffffafe0c45cSsystem10570417584ffffffffafe0d3e4Sapp11338019492ffffffffafe0d3e4Sapp9539213228ffffffffafe0d3e4S9516413376ffffffffafe0d3e4Sapp9770014264ffffffffafe0d3e4Sapp9413212624ffffffffafe0d3e4S afe0c1bcR从系统的进程中可以看到,系120号进程为父进程。init是系统运行的1个进程Android根目下init可执行程序,这是一个用户空间的进程。kthreadd是系统2号进程,这是一个内核进程,其他内核进程都Zygote、/system/bin/sh、/system/bin/mediaserver等进程是被init运行起来的,等进程代表的是应用程序进程,它们的父进程都是zygote。adbinstalladb使用adb安adbinstalladb使用adb在主机和目标机之间传送文件的方法为adbadbpush{host_path}adbpull{target_path}mksdcard[-llabel]<size>mksdcard[-llabel]<size>其后面可以跟K、M、G等参数,file是磁盘映像的文件名称,这个文件也就是在mksdcard的一个使用的示例如下所示mksdcardmksdcard128M这表示建立了一个大小为128M,名称为sdcard.imgFat32磁盘映像文件使用设备Device工具可以用于进一步控制仿真器的运行状况,在其中可以查看功能。Device工具的窗口如图所示:AndroidAndroid中建立工建立工建立Android工程步骤如下:选择选择“Android”>“AndroidProject”,点击“Next”按钮thecontentsfortheproject 中需要具有AndroidManifest.xml文件。可以使用SDK的platforms/android-XXX/samples中的各个子 这是SDK自带的示例程序,例如,使用oActivity示例程序。点击“Finish”按钮,工程将被建立查看和编辑各个文查看AndroidManifest.xml文件的情况,如图所示AndroidManifest.xml中的内容。浏览布局文件,如图所示浏览布局文件是一个更有用的功能,可以直观地查看程序的UI布局,点程序没有运行的情况下直接查看和组织目标UI界面。查看各个value文件和建立数值,如图查看各个Java源代码文件Java构。IDE的源代码环境开发JAVA程序,还具有自动修正、自动增加依赖包、运行工或者“DebugAs”来运行和调试工程:Android开始运行后,在IDE下层的控制台(console)中,将出现目标运行的信息,可以获取目标运行的信息。出现类似的Log信息 oActivity]Android oActivity]adbisrunning oActivity]Performingcom.example.android. activitylaunch runningcompatibleAVD'HVGA'[[[[[[oActivity]DeviceAPIversionis4(Android1.6)oActivity.apkontodevice'emulator-5554' oActivityondevice oActivity oActivity程在运行的一个仿真设备的时候,可以进一步通过选择“RunAs”中的“RunConfigurations”进行进一步的配置。启动后的界面如图所示:在Target中可以选择启动的时候使用的设备。第二Android应用程序的概述和框架3Android应用层程序的开发方 API应用程序开发的结Android预应用程Android应用程序开发是Android开发中最上面的一个层次,它们构建在类,Android预应用程应用程应用程应用程应用程系统Android框架层软硬件抽象硬件抽象 Android仿真器图AndroidAndroid系统本身内置了一部分标准应用(也包括内容提供者),在仿真器(包括SDK环境和源代码环境)中已经包含这些内置的程序。用户自行开发的应用程序Android内置的应用层程序包位于同一个层次,在默认的Android系统中。API参考文档的使在开Android应用程序时可SDK中提供的参考文档,其内容Reference中ClassIndex(类索引包索引根据字母顺序列Android的各个包,每个包中包含若干个类、接口根据包索引,每一个包中包含的主要内容大致如下所示Interfaces(接口类Classes(类Enums(枚举值Exceptions(异常每个包中包含的内容,基本上是Java语言中标准的内容Android的参考文档中的类AndroidAPI的主要组成部分,主要参考根据类索引,每一个类中包含的主要内容大致如下所示Overview(概览Constants(常量Constructors(构造方法例如,Activity类的帮助文档的前面的信息如下所publicpublicextendsimplementsComponentCallbacksKeyEvent.CallbackLayoutInflater.FactoryView.OnCreateContext ListenerWindow.Callback↳↳↳KnownDirectSubclassesActivityGroup,AliasActivity,ExpandableListActivity,KnownIndirectLauncherActivity,PreferenceActivity,从Activity类中可以看出,类的帮助文档主要包含以下一些 sa个类只有一个唯一的父类Activity类在android.appandroid.view.ContextThemeWrapper,并且ActivityGroup,ListActivity等几个类直接继承。被LauncherActivity等几个类间接继承。Class(类的介绍(常量的列表Inherited(继承的常量的列表,按Class(类的介绍(常量的列表Inherited(继承的常量的列表,按照继承类的顺序Public(公共的构造函数Public(公共方法的列表Protected(保护方法的列表Inherited(继承方法的列表,按照继承类的顺序(详细的介绍(详细的介绍类的帮助中一般只列出了自己的常量、方法、XML属性等,对于继承得到的内容(包括方法和常量),按照继承的顺序列出。由于JAVA类是单向继承,某些与UI内容相关的类的帮助文档有一些特殊,主要区别是包含了XMLattributes(XML属性)一类。XMLAttributes(XML属性)出现在AndroidManifest.xml或者布局文件中(*.xml)的属性。例如Button类的参考文档的主要内容如下所示extends↳↳↳android.widget.ButtonKnownDirectSubclassesCompoundButtonAbuttonwithtwostates,checkedandKnownIndirectSubclassesXMLSeeButtonAttributes,TextViewAttributes,ViewInheritedXMLFromclassandroid.widget.TextViewFromclassandroid.view.ViewInheritedConstantsPublicConstructorsInheritedMethodsButton类的头部信息和普通的类基本相同,但是包含XMLattributes一个项目,在这里ButtonAttributes,TextViewAttributes,ViewAttributes,根据类的继承关系可以得知,这个启示是自己的属性、父类的属性(Button类的父类是android.widget.TextView)、祖父类的属性(Button类的祖父类是XMLAttributes项目的Fromclassandroid.widget.TextView和Fromclass性名称)RelatedMethod(相关方法)Description(描述)几个项目。例如,TextView的几个属性如下所示 Texttodisplay. Textcolor.android:text等表示了属性在XML文件中的名称,setText()等表示了在源文件中使用的方法,最右侧的内容是这个属性的描述PackageIndex→android→android.R.styleable中列出了一些类的XML属性TextView属性的相关内容如下所示publicpublicstaticfinalintIfset,specifiesthatthisTextViewhasatextualinputmethodandshouldautomaticallycapitalizewhattheusertypes.Thedefaultis"none".MustbeoneofthefollowingconstantConstantValue 0Don'tautomaticallycapitalizeanything. 1Capitalizethefirstwordofeachsentence. 2Capitalizethefirstletterofeveryword.characters3Capitalizeeverycharacter.ThiscorrespondstotheglobalattributeresourcesymbolConstantValue:44使用的还是名称。整数值是Android内部运作使用的。XML属性有些是在布局文件中使用的,也AndroidManifest.xml中使用的,或者在其他的XML文件中使用。在AndroidManifest.xml中使用的属性。publicstaticfinalint[]publicstaticfinalint[]Attributesthatcanbe oftheintent-filtertag.SeeaddAction(String)formoreinformation.IncludesthefollowingAttributeSeeAlsoAttributeSummary中的android:name 的内容是AndroidManifest.xml中的Action可以使用的android:name属性。例如,View.OnClickListener的帮助信息前面的内容如下所示publicstaticinterfacepublicstaticinterfaceKnownIndirectSubclasses接口在android.view这个包中。对于一个接口,IndirectSubclasses的含义(implements)这个接口PublicvoidonClick(Viewv)CalledwhenaviewhasbeenView.OnClickListener的帮助信息后面的PublicvoidonClick(Viewv)Calledwhenaviewhasbeen这些方法是要求接口的实现者来实现的,如果一个类实现了View.OnClickListene这个接口,其中就必须要有这个接口的onClick()函数4Android应用程序示 oActivity程序的运oActivity是一个简单的Android应用程序,其工程文件名称oActivityAndroid的源代码和SDK中,都包含了这个包oActivity的图标和运行情况如图所 上显示“o,World!”字符串。 的源文件结 树的方式如下所示| (工程管理文件| (工程描述文件| (资源文件 |-- `- (布局文件 `-- ` (字串资源文件| (Java源代码文件`--`--`--`--`- AndroidManifest.xml文件,这是另一个工程, Android.mkLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=#Onlycompilesourcejavafilesinthisapk.LOCAL_SRC_FILES:=$(callall-java-files-under,src)LOCAL_PACKAGE_NAMEAndroid.mkAndroid的工程管理文件,这个文件只在源代码开发的时候使用SDK的开发中不需要LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=#Onlycompilesourcejavafilesinthisapk.LOCAL_SRC_FILES:=$(callall-java-files-under,src)LOCAL_PACKAGE_NAMELOCAL_SDK_VERSIONLOCAL_SDK_VERSION:=currentinclude$(BUILD_PACKAGE)#Usethefollowingincludetomakeourtestapk.Android.mk文件是Android编译过程中通用的工程管理文件,本地程序、本地库和Java程序包都使用这个文件。这个文件仅仅在基于源代码开发的情况的内容是使用include$(BUILD_PACKAGE)表示从当前 编译Java应用程序包。LOCAL_PACKAGE_NAME定义的是这个程序的APK包的名称。LOCAL_MODULE_TAGS表示这个包的类型。这个包LOCAL_MODULE_TAGS定义成samples,这APK包, 中的Android.mk文件,本例中也就是tests 文<?xmlversion="1.0"encoding="utf-<manifest <application o,<activity <?xmlversion="1.0"encoding="utf-<manifest <application o,<activity <intent-<action<category</intent-application(表示应用程序)中包含了一个activity(表示活动。活动是应用程序中的一个组件,一个应用程序中也可以包含若干个组件。包名定义为com.example.android.oactivity,表示将从src目录的com/example/android/oactivity中寻找程序中的Java源代码。活动名称将被定义为oActivity,表示活动的代码是上述源代码中的oActivity.java文件。intent-filter中的内容指定了程序的启动方式,这里category中的ent.category.LAUNCHER表示活动将Android的桌面(Android默认的桌面程序名称也是LAUNCHER)上出现。pn的nbl"面的文字以及活动启动后上面的标题文字是一致的。本例没有指定图标,所以桌面<activityandroid:name=" <intent-<action<category</intent-在AndroidManifest.xml文件中为一个活动指定label()和icon<activityandroid:name=" <intent-<action<category</intent-android:label指定为字符串、android:icon指定为图标后,将使用中对称的文件作为图标(本例中将使用icon_name.png)activityapplicationandroid:labelandroid:icon等属性,由于活动是程序的单元,且应用可以包含多个活动,因此程序首先将使用activity中的这些,如果没有则使用上一级的application中的定义源代码文oActivity工程只有一个源代码文 oActivity.java,位于这个工程下的 oactivity中,内容如下所示packagecom.example.android. importandroid.app.Activity;importpublic oActivityextends{public oActivity(){}

定义包引入包含的布局文

publicvoidonCreate(BundlesavedInstanceState)onCreate()方 o_activity);//使 }}}这里的类oActivity继承实现了Android系统API提供的活动类(Activity),使setContentView(R.layout.o_activity)指定了当前活动的布局,这里表示将从res/layout中找到o_activity.xml文件作为本例的布局文件使布局文<?xmlversion="1.0"encoding="utf- <?xmlversion="1.0"encoding="utf- "@string/o_activity_text_text",这个值在另外的资源文件中被定义,本例就是其他资源string.xml是本例中的一个资源文件,其内容如下<?xml<?xmlversion="1.0"encoding="utf-<stringo,oWorld!,oActivity的编译结在Android的SDK环境开发中,oActivity工程经过编译后,SDK环境下开发生成的所有目标文件均在当前工程中,包含assets、bin、gen等。gen中,包含了以类的层次关系为结构的资源文件。例如,/example/android/oactivity中的R.java就是oActivity中的资源文件。在 子包含了经过编译后的各Java类,以.class为后缀bin中包含的classes.dex文件是编译后的Dalvik虚拟机上运行的Java的字节码文件,生成的oActivity.apk文件是最终的APK文件,可以在兼容的AndroidAPI的目标系统中安装,进而运行程序。oActivity.apk经过解压缩后,包含了下面的一些内容 |--META- |-- |-- `--| |-- `-- `-- 的程序的运SkeletonApp是Android中一个应用程序的框架,这个程序 复杂一些,这个程序的运行结果如图SkeletonApp容,菜单的功能和两个按钮时是相同的,点击菜单按钮将出现菜单,菜单是Android中的标准组件。 的源文件结 | |-- `-- |-- ` `-- | | ` | (Java源代码文件`--`--SkeletonApp中,资源resvalues中除strings.xml文colors.xml文件的内容如下<?xml<?xmlversion="1.0"encoding="utf-<!--RetrievedviaResources.getColor()andfriends.--<color<!--RetrievedviaResources.getDrawable()andfriends.--<drawable styles.xml文件的内容如下<?xml<?xmlversion="1.0"encoding="utf-<style<item<item<item<stylename="TextAppearance"<style<item res还包含了 <Buttonandroid:id="@+id/back"style="@style/ActionButton"android:text="@string/back"/><ImageViewandroid:id="@+id/image"<ImageViewandroid:id="@+id/image"android:src="@drawable/violet"/><Buttonandroid:id="@+id/clear"style="@style/ActionButton"android:text="@string/clear"android:textColor="@color/red"/>布局颜色可以作为字体的颜色,style/ActionButton作为按钮的样式,drawable/semi_black表示了背景的内容,drawable/violet表示violet.jpg作为图像的内容。例如根据上面styles.xmlJAVA源代码SkeletonActivity.java中构建了菜单、按钮的动作等功能SkeletonApp的编译结Android中程序的编译结构基本类似,SkeletonApp的应用程序包SkeletonApp.apk经过解压缩后,包含了下面的一些内容 |--META- |-- |-- `--| |-- |-- `-- (保持原状的文件 `-- ` `--5Android应用程序的内 应用程序的概念性描每一个应用程序将被编译成Android的一个Java应用程序包(*.apk)。Android系统本身是基Linux操作系统运行的,因Android应用程序也运行于Linux环境中,它们具有以下的特点:应用程序的组成部一般情况下,Android应用程序由以下4种组件活动(Activity广播(BroadcastReceiver服务(ServiceProvider一个Android应用程序是一个包(Package),包中可能包含一个或者多Android组件(component)活动活动是最基本Android应用程序组件,在应用程序中,一个活动通常就是一个单独的用户界面。每一个活动都被实现为一个独立的类,并且从活动每一个活动在界面上可以包含按钮、文本框等多种可视的UI元素。广播服务正在从列表中歌曲的器在运行。内容提供者(Content应用程序的生命周Android进程的重要性分级,可以理解成执行的优先级。Android进程的类型包括(按重要性分级排序前台(Foreground)进;进程有一个正在运行 BroadcastReceiver(它BroadcastReceiver.onReceive()方法正在执行进程有一个ServiceService的某个方法(Service.onCreate或者可见(Visible)进它有一个可以被用户从屏幕上看到的Activity,但不台——其服务(Service)进看到,但它们做的事情却是用户所关心的(例如:MP3回放或网络数(Background)进程拥有一个当前用户看不到的Activity(它onStop()方法被调用),这些进程对用户体验没有直接的影响。如果它们正确执行Activity生命周期,系统可以在有很多这样的进程在运行,因此要将这些进程保LRU列表中,以确保当内空(Empty)进及运行情况考虑,可以关注Android的各种组件相对应的生命周期。活动Android中最重要、最基础的组件,用户在界面上看到的一个个可以切换的屏幕界面就是Android中的活动。活动的生命周期如图1所示。onCreate()、onStart()和onResume()这3个方法被依次调用,活动对应的界面出现在屏幕上。(Foreground(Background动转入运行。如果活动变为不可见,还将调用onStop()方法。在转入后台时,onStop()是否被调用取决于活动是否被完,在新的活动有透明复,这时onResume()方法将被调用,活动重新转入前台运行。活动完全退出的情景:当使用回退(Bck)按钮退出活动时,oe方法将被调用,活动关闭。如果系统缺少内存时,也会杀死(kl)的服务可以长时间运行,它的特点是没有可视化界面,服务的生命周期如图所示(Service)和onStart()这两个方法将被调用,服务会在运行直到退出,退出时将调用e广播的生命周广播有一个单一的回调方法onReceive(),当广播消息到达时广播只有在这个方法的执行过程中才处于活动状态,当onReceive()返回后,广播将不再处于活动状态。广播的功能类似于一个回调函应用程序包含的各个文AndroidManifest.xmlJava源代码:按照Java包的方式来组织 结构,包括各个Java类的源代资源文件:包含XML文件、、原始数据文件等,其中表示界面情况的在编Android应用程序的过程中,Java源代码使用SunJDKJava编译成Java字节码文件(多个后缀名为.class的文件),这一步骤和标准的(单一文件classes.dex)AndroidManifest.xml文件经Android打包工具(aapt)处理后形成二进制格式AndroidManifest.xml文件,实质的内容与以前相同。述文件、Java源文件、资源文件Android应用程序的三个部分;在编译之前的工程中是这三个部分,在编译之后APK包依然是由这三个部分组成的。Android应用程序的编译过程如图所JavaJavadxaapt根aapt根aapt包的MetaAPKClassDexAndroid如图所示,Android源文件经过了标准Java编译器的编译,又经过了dxdex文件(classes.dex)是一个单一文件,将工程中所有Java源代码文件对应机将运行这些dey文件。如果应用程序包文件不发生变化,dey文件不会被重新生成;在应用程序包发生更新的情况下,将重新由dex生成dey。Android和标准JAVA开发的JAR包最大的不同在于,标准JAVA字节码是每个文件一个Clash文件,而Android中的一个包将生成一个Dex文件。am工具启Android除了在GUI界面中启动应用程序之外,在Android令行终端(可以使adbs进行连接)也可以使用am工具启动应用程序am命令的基本使用方法如下usage:usage:am[start|broadcast|instrument]amstart-DINTENTambroadcastaminstrument[-r][-e<ARG_NAME><ARG_VALUE>][-p<PROF_FILE>][-w]<COMPONENT>[-a[-a<ACTION>][-d<DATA_URI>][-t<MIME_TYPE>][-c<CATEGORY>[-c<CATEGORY>]...][-e|--es<EXTRA_KEY><EXTRA_STRING_VALUE>...][--ez<EXTRA_KEY><EXTRA_BOOLEAN_VALUE>...][-e|--ei<EXTRA_KEY><EXTRA_INT_VALUE>...][-n<COMPONENT>][-f<FLAGS>]使用URI的格式,使用-n指定组件。amstartn包名}/{包名}.活动启动Android设置工具令如下所示##amstart-n 启动Android计算器程序令如下所示##amstart-n 启动Android机程序令如下所示#-启动Android照相机程序令如下所示##amstart-n 启动Android机程序令如下所示##amstart-n 启动Android音乐浏览器令如下所示##amstart-n 启动Android浏览器令如下所示##amstart-n 启动Android网络浏览器等令如下所示##amstart-n 器都在Music包中,照相机和机都在Camera包中。#amstart-n#amstart-n#amstart-ncomfile:///a.mp3.android.music.MediaPlaybackActivity-.android.music.MediaPlaybackActivity- #amstart-n .android.camera.MovieView-d 视频播放、图片浏览等功能。com.android.music.MediaPlaybackActivity、com.android.camera.MovieView和com.android.camera.ViewImage分别是对应的应用程序。##ent.action.VIEW-dfile:///a.mp3-taudio/*#ent.action.VIEW-dfile:///b.mp4-t/*#ent.action.VIEW-dfile:///c.jpg-timage/*这里使用的是am-a参数,表示执行一个动作,后面的audio/*、/*和来打开对应的音乐、和文件。6章UI的基本外形和控制 弹出AndroidUI系统的知识结构如下图所示 使用 键盘事运动事屏幕间跳框菜样 OpenGL3D接 图AndroidUII系统地使用,首先是由应用程序来控制屏幕上元素的外观和Inod方面,包含了基本的控件控制,键盘事件响应,窗口间跳转、框、菜单、样GUI系统所具有的通用内容。控件和基本事件的响的内容。对于Android应用程序,控件称为View。Android中,在处理UI中的各种元素的时候,两个程序中的要点为得到布局文件(XML)图控件事件的响应事件响应方<activity<activityandroid:name="TestEvent1"<intent-<action<category</intent-本例定义了一个Android<LinearLayout<LinearLayoutxmlns:android="http://sandroid:layoutwidth="fillparent"<TextViewandroid:id="@+id/text1"android:layoutwidth="wrapcontent"android:layoutgravity="center"android:text="@string/text1"/><Buttonandroid:id="@+id/button1"android:layoutwidth="80sp"android:layoutgravity="center"<Buttonandroid:id="@+id/button2"android:layoutwidth="80sp"android:layoutheight="wrapcontent"为View后,显示的内容就如上图所示,只是行为还没有实现。packagepackageimportandroid.os.Bundle;importandroid.widget.Button;importandroid.view.View;importandroid.util.Log;publicclassTestEvent1extendsActivityprivatestaticfinalStringTAG="TestEvent1";publicTestEvent1(){}publicvoidonCreate(BundlefinalTextViewTextTextView)findViewById(R.id.text1);获得柄finalButtonButton1=(Button)findViewById(R.id.button1);finalButtonButton2=(Button)findViewById(R.id.button2);Button1.setOnClickListener(newButton1.setOnClickListener(newOnClickListener(){//publicvoidonClick(View{}Button2.setOnClickListener(new{publicvoidonClick(Viewv){}}}这里使用的R.id.button1id是对应的。实际上,在布局文android:id这一项也可以正常显示,但是如果需要在代码中根据Button控件的setOnClickListener()设置了其中的点击行为,这个方法的参的功能,在点击的函数中,将通过Text的句柄对其进行控制。使用findViewById()获取布局文件(XML)使用setOnXXXListener()SetOnXXXListener()等函数是android.view.View类的函数,各种控件(voidvoidsetOnClickListener(View.OnClickListenervoidsetOnFocusChangeListener(View.OnFocusChangeListenerl);voidsetOnKeyListener(View.OnKeyListenerl);voidsetOnLongClickListener(View.OnLongClickListenerl);voidsetOnTouchListener(View.OnTouchListenerl);行为。这些函数的参数都是所对应的android.view.View类中的方法。并通过OnClickListener()等定制句柄的行为。第二种响应方功能。本例中使用的是另外的式实现。packagepackageimportandroid.os.Bundle;importimportandroid.widget.Button;importandroid.view.View;importandroid.util.Log;publicclassTestEvent2extendsActivityimplementsOnClickListener//实现相关的接口privatestaticfinalStringTAG"TestEvent2";privateTextViewmText;privateButtonmButton1;privateButtonpublicTestEvent2()}publicvoidonCreate(BundlemText=(TextView)findViewById(R.id.text1);mButton1=(Button)findViewById(R.id.button1);mButton1.setOnClickListener(this);//设置 mButton2=(Button)findViewById(R.id.button2);mButton2.setOnClickListener(this);//设置 }publicpublicvoidonClick(View{Log.v(TAG,"onClick()"); caseR.id.button1:caseR.id.button2:}}}onClick()setOnClickListener()将其设置到按钮中的参数就是this,表示了当前的活动。(mext样就可以在类的各个函数中都能获得这个句柄进行处理。这和上法是有区别存TextView的句柄。第三种响应方importandroid.util.Log;publicclassimportandroid.util.Log;publicclassTestEvent3extendsprivatestaticfinalStringTAG="TestEvent3";privateTextViewmText; = publicTestEvent3()}publicvoidonClick(View{}}publicvoidonClick(View{}}publicvoidonCreate(BundlemText=(TextView)finalButtonmButton1=(Button)findViewById(R.id.button1);finalButtonmButton2=(Button)mButton1.setOnClickListener(mListener1);//设 者的mButton2.setOnClickListener(mListener2);//设 者的}}键盘事件的响理是响应之间在程序中使用键盘的内容。本例需要实现的内容是通过键盘来控制屏幕上的一个的Alpha值,使用上键和右键增加的Alpha值,使用下键和左键减少的Alpha值。显示内容如下所 图按键事件的响应本例的布局文件testkeyevent.xml<LinearLayoutxmlns:android="http://s <TextViewandroid:id="@+id/alphavalue"<ImageViewandroid:id="@+id/image" packagepackageimportandroid.app.Activity;importimportandroid.util.Log;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.TextView;publicclassTestKeyEventextendsActivityprivatestaticfinalStringTAG="TestKeyEvent";privateImageViewmImage;privateTextViewmAlphavalueText;privateintmAlphavalue;protectedvoidonCreate(Bundle{super.onCreate(savedInstanceState);mImage=(ImageView)findViewById(R.id.image);mAlphavalueText=(TextView)findViewById(R.id.alphavalue);mAlphavalue=100;mAlphavalueText.setText("Alpha="+mAlphavalue*100/0xff+}publicbooleanonKeyDown(intkeyCode,msg){Log.v(TAG,"onKeyDown:keyCode="+keyCode);Log.v(TAG,"onKeyDown:String="+msg.toString());switch(keyCode)caseKeyEvent.KEYCODEDPADUP:caseKeyEvent.KEYCODEDPADRIGHT:mAlphavalue+=20;caseKeyEvent.KEYCODEDPADDOWN:caseKeyEvent.KEYCODEDPADmAlphavalue-=20;}if(mAlphavalue>=0xFF)mAlphavalue=0xFF;if(mAlphavalue<=0x0)mAlphavalue=0x0;mAlphavalueText.setText("Alpha="+mAlphavalue*100/0xff+"%");returnsuper.onKeyDown(keyCode,msg);}}函数,其参数intkeyCode为按键码,KeyEventmsg表示按键事件的消息(其中包含上面打出的logVERBOSE/TestKeyEvent(771):onKeyDown:keyCode=VERBOSE/TestKeyEvent(771):onKeyDown:keyCode=20VERBOSE/TestKeyEvent(771):onKeyDown:String=KeyEvent{action=0code=20repeat=0meta=0scancode=108finalfinalint //finalintgetFlags() //获得标志finalintgetKeyCode() //获得按键码finalintgetRepeatCount() finalintgetScanCode() //获得扫描码运动事件的处publicbooleanonTouchEvent(MotionEventevent)publicpublicbooleanonTouchEvent(MotionEventevent)publicbooleanonTrackballEvent(MotionEventevent)本例介绍另外触摸屏事件的程序,这个程序在UIpackagepackageimportandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importpublicclassTestMotionEventextendsActivityprivatestaticfinalStringTAG="TestMotionEvent";TextViewm

温馨提示

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

最新文档

评论

0/150

提交评论