![配套课件-GoogleAndroid开发技术_第1页](http://file4.renrendoc.com/view14/M06/15/17/wKhkGWefmXaAfgldAACHDPMHmcw784.jpg)
![配套课件-GoogleAndroid开发技术_第2页](http://file4.renrendoc.com/view14/M06/15/17/wKhkGWefmXaAfgldAACHDPMHmcw7842.jpg)
![配套课件-GoogleAndroid开发技术_第3页](http://file4.renrendoc.com/view14/M06/15/17/wKhkGWefmXaAfgldAACHDPMHmcw7843.jpg)
![配套课件-GoogleAndroid开发技术_第4页](http://file4.renrendoc.com/view14/M06/15/17/wKhkGWefmXaAfgldAACHDPMHmcw7844.jpg)
![配套课件-GoogleAndroid开发技术_第5页](http://file4.renrendoc.com/view14/M06/15/17/wKhkGWefmXaAfgldAACHDPMHmcw7845.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章Android系统概述1.1Android操作系统的概念
1.2Android系统结构
1.3Android开发平台
1.4小结
Android音译为“安卓”。Android系统是安装在移动设备(例如智能手机、个人数字助理(PDA)、MP5播放器、手持终端、平板电脑、上网本、电子书等)上的操作系统软件,用于管理和调度移动设备的软、硬件资源。其作用相当于个人电脑(PC)上安装的微软Windows操作系统,与安装在智能手机上的WindowsMobilePhone(WindowsCE)操作系统相似。Android系统与桌面Windows系统、WindowsCE操作系统的异同点列于表1-1,从表1-1中所列的特点,我们可以对Android系统有一个全面直观的认识。表1-1Android系统与桌面Windows系统、WindowsCE操作系统的异同点
Android系统由AndyRubin首创,最初的目的是设计一种新的开放性智能手机操作系统。2003年美国就已经有大量的移动设备使用嵌入式操作系统,新研发的操作系统想进入市场并被用户认可是件很困难的事情。然而当时的大部分嵌入式操作系统都不是开源的,维护十分困难,Rubin等人因此提出这种开源的智能手机操作系统,希望借此挤进激烈竞争、商机无限的嵌入式操作系统市场中,其赢利主要靠安装、维护和提供专业特色应用软件等技术服务。现在看来,Rubin的做法成功了。2005年8月Google收购Android加速了该开源嵌入式操作系统的发展,2007年以Google为首组建了全球性的开放手机联盟(OpenHandsetAlliance),中国电信、中国移动和中国联通也是其中的成员,在全球范围内推动基于Android操作系统的手机开发计划。2008年10月宏达电(HTC)公司推出了第一款Android系统的手机,命名为HTCDream(G1),如图1-1(a)所示,这是一款被市场证实成功的手机。随后,几乎在全球形成了研究Android操作系统的热潮。Android操作系统的功能和版本逐年提高,目前已经是第2.3.3版,内部研发版本则更高。图1-1(b)是基于Android2.3.3版本的Flyer智能手机。2011年初,Android已经成为嵌入式操作系统领域最受欢迎的智能操作系统。图1-1HTCDream(G1)和HTCFlyer
1.1Android操作系统的概念
Android操作系统是基于Linux内核的嵌入式操作系统,其底层(称为第一层)为Linux操作系统及其驱动,该层源代码是用C语言编写的。底层上面建构了系统库和Java运行时(即Java程序运行支持软件包或Java虚拟机,“运行时”是由“Runtime”意译而来,在很多书上均采用这一译法),称为第二层,这一层是使用C/C++代码写成的。第三层为应用程序框架层,为用户开发Android程序直接提供API(应用程序接口)函数,这一层是用Java代码实现的。第四层为用户应用程序层。由于Android操作系统内置了许多用户应用程序,因此有些专家认为应用程序层可以划分到Android操作系统中。当然,用户自己编写的应用程序也属于这一层。这一层的应用程序使用Java语言来设计。Android系统结构如图1-2所示。图1-2Android系统结构
Android系统相对于其他嵌入式操作系统而言,具有两个明显的优点,即开放源代码和网络功能强大。前面提到了Android系统最初开放源代码的原因,从2003年到今天仍然保持着这一独特的优势,除了嵌入式操作系统领域市场竞争激烈外,Android使用Linux作为其底层平台是其开源的另一个重要原因。Google本身是互联网公司,其下的所有产品都是基于互联网模式发展的,Google收购的Android系统也不会例外。伴随着Android系统的诞生和版本升级,Android系统的网络功能越来越强大,这使得基于Android系统编写网络程序比基于其他任何嵌入式操作系统都更加容易。可以说,一部Android手机就是一部互联网终端,网上购物、新闻、旅游、导航、智能家居等应用的确给用户带来了极大的生活便利。
Android系统使用Java语言编写应用程序,从一定意义上可以说Android系统推动了Java语言的广泛应用。Java语言属于面向对象的高级语言,Java语言程序必须借助于Java虚拟机解释执行,它比其他高级语言的可移植性都强。在Android模拟器上运行成功的应用程序,一定能够成功地部署和运行在Android系统终端机上,这使得Android系统应用程序的开发变得非常方便。
Android系统的图形界面也是它的一个亮点,严格地说,Android系统不是基于可视化窗口的,而是直接基于图形的。也就是说,Android系统界面是由一幅幅图画组合在一起的,因此,Android系统界面比较“炫”! 相比于WindowsCE的视窗而言,其更人性化一些。Android系统界面美观是其受到用户欢迎的最重要的原因,尽管如此,Google对现有Android系统界面仍然不很满意,据说新版本的Android系统在用户界面上还会有较大的创新。目前最新的Android系统版本号为2.3,研发代号为Gingerbread(姜饼),其主要的功能和特点如下:
(1)系统源代码公开,通过SDK(SoftwareDevelopmentKit)和模拟器AVD(AndroidVirtualDevice)可以在PC机上体验Android2.3的功能;
(2)支持无线通信和3G网络;
(3)用户界面可定制为个性化界面;
(4)支持互联网功能、后台下载和在线文件夹(即网络文件夹),采用Google搜索服务;
(5)支持多摄像头、陀螺仪等多种传感器,这样一部Android手机可以集成前、后两个摄像头;
(6)具有强大的多媒体功能,支持混响音效(例如低音、环绕和虚拟化效果等);
(7)具有强大的图像管理功能,支持JPG、GIF、PNG和BMP等格式图像文件;
(8)支持Web浏览器;
(9)支持WiFi、蓝牙和近距离通讯(NearFieldCommunications,NFC)等;
(10)具有地图、定位和GPS功能等。 1.2Android系统结构
图1-2为Android系统结构图,由于直接翻译Android系统组件的术语并不准确,因此这里给出了经典的英文Android系统结构图,如图1-3所示。图1-3Android系统结构图由图1-3可知,Android系统是基于Linux内核的操作系统,习惯上把Linux内核(LinuxKernal)层称为其第一层。Linux是免费和公开源码的实时抢先式多任务操作系统,Linux内核协助Android系统完成进程调度、进程间通信、内存管理、虚文件系统管理、系统安全管理和设备驱动等功能。图1-3中仅列举了Linux内核实现的10种设备驱动功能,即显示驱动、摄像驱动、Flash存储驱动、蓝牙驱动、BinderIPC驱动(用于进程间通信管理)、USB驱动、键盘驱动、WiFi驱动、音频驱动、功耗管理。事实上,Linux内核还协助Android完成强大的网络管理和驱动等,被视为Android系统的一个硬件抽象层。正因为Android基于Linux内核,很多专家指出,要深入学习Android必须加强Linux系统的学习。但如果重点放在Android应用程序设计上,即使不懂Linux,对学习Android程序开发也影响不大。由于Android系统是架构在Linux系统之上的,因此Linux系统不支持的处理器,Android系统也同样无法支持,即Android系统只能移植到Linux系统可以运行的处理器上。好在Linux系统支持大多数流行的处理器,例如x86结构、ARM、MIPS等。Linux系统的这种广泛的可移植性决定了Android系统具有广泛的可移植性。第二层是Android系统库(Libraries)和Android运行时(Runtime),这一层是使用C/C++代码编写的。Android系统库包含了大量的类,通过第三层(即应用程序框架层)被应用程序开发者调用,应用程序开发者使用的大量API(应用程序接口)函数来自于这些类。API函数越丰富,则用户开发应用程序的工作量越小。随着Android系统版本的升级,API函数级别也随之上升,如表1-2所示。表1-2Android系统与API级别的关系表1-2显示的最新的API级别为11。从表1-2中可以看到Android系统每个版本的研发代号都是一种食品的名称,依次译为“杯形蛋糕”、“炸面圈”、“指形小饼”、“冻酸奶”、“姜饼”、“蜂巢”和“冰淇淋”,估计发起人是一位美食家,可以预见下一个版本一定也是一种流行的受人喜爱的小食品名称,这也正是Android系统研发的用意所在,希望能受到系统研发者和应用程序开发者们的喜爱。图1-3中第二层Android系统库给出了9个组件,即SurfaceManager(界面管理器)、MediaFramework(多媒体框架)、SQLite、OpenGLES、FreeType、WebKit、SGL、SSL和Libc。这9个组件都十分复杂,下面简要说明一下各个组件的作用。
SurfaceManager(界面管理器)负责显示相关的操作,Android系统界面是基于图形系统的,这种图形系统采用客户端/服务器的方式进行工作。“客户端”就是用户的应用程序界面,而“服务器”负责与这个应用程序界面相关的数据管理,由一个称为SurfaceFlinger的组件管理,“服务器”与“客户端”的通信需要借助于Binder类。界面管理器就是要管理这种工作方式,以实现对二维或三维图形的显示。
MediaFramework(多媒体框架)是一个非常实用的类库,其中封装了大量处理多媒体数据的API函数,支持流行的绝大部分多媒体格式,使得应用程序开发者开发多媒体软件时非常轻松,只需要调用多媒体框架中的API函数就可以了。
SQLite是Android集成的关系型数据库,也是公开源代码的嵌入式数据库,支持ANSISQL92标准的大部分SQL(结构化查询语言)语句,它速度快、体积小(约250KB),最大能支持的数据库文件大小为4TB。
OpenGLES是Android系统中二维和三维图形处理与加速的API函数集。
SGL是SkiaGraphicsLibrary的首字母简写,是Android用来处理二维图形的向量图形引擎。所谓的“引擎”术语是从汽车术语借用过来的,在计算机软件中的引擎是指软件处理中的最核心部分,就像汽车发动机是汽车的核心一样,一个软件功能的升级主要取决于其“引擎”部分的升级。SGL就是Android系统的二维图形引擎。
FreeType是Android系统使用的字体引擎,FreeType是公开源码和免费的,其优点在于提供简单、统一的API函数访问多种字体格式文件,例如位图字体和矢量字体,这使得Android系统处理字体时非常方便。
SSL是SecureSocketsLayer的首字母简称,即安全套接层,这说明Android系统支持SSL,即安全套接层协议。SSL对发送的网络数据进行加密,防止数据在传送至合法目的地网络终端的过程中被非法用户使用或修改。这在电子商务和网上银行的数据交换中尤为重要。SSL通过对合法用户的认证和数据的加密,确保用户的信息安全,Android系统自诞生以来,就支持SSL协议。事实上,所有的嵌入式操作系统浏览器都支持SSL协议。
WebKit是公开源码的网络浏览器引擎,这个引擎稳定性好、兼容性强、效率高,不仅Android系统浏览器基于WebKit引擎,苹果的iPhone浏览器也基于这个引擎。
libc是通用的C语言库,供Android系统库调用。
Android运行时(Runtime)包括核心库(CoreLibraries)和Dalvik虚拟机(VirtualMachine)。核心库集成了绝大多数Java语言核心库的功能,供Java语言程序运行时调用。Dalvik虚拟机解释并运行格式为dex的Java程序,术语dex是DalvikeXecutable的缩写,常规的Java语言程序(class字节文件)通过Android系统内置的dx工具转化为dex格式,这种格式被优化为代码内存占用最小的文件格式,因此,Android的可执行文件扩展名为.dex。每个Android应用程序启动后都对应着一个进程,该进程属于它自己的Dalvik虚拟机实例。Dalvik虚拟机可以同时高效地运行多个虚拟机实例,从而实现多任务处理。第三层为Android应用程序框架,进行Android应用程序开发必须熟练掌握其4种基本组件,即活动(Activity)、服务(Service)、广播接收器、内容提供者(ContentProvider)的使用技术。应用程序框架层为开发Android应用程序提供了各种API函数,这些函数属于不同的类。图1-3中列出了10类组件,即活动管理器(ActiviteManager)、窗口管理器(WindowManager)、内容提供者(ContentProviders)、视图系统(ViewSystem)、通知管理器(NotificationManager)、包管理器(PackageManager)、电话管理器(TelephoneManager)、资源管理器(ResourceManager)、地址管理器(LocationManager)、XMPP服务(XMPPService)。其中,XMPP是GoogleTalk的通信协议,而GoogleTalk简称GTalk,是Google的即时通讯方式,也就是通常所说的文字或语音聊天。此外,GTalk还支持E-mail功能。第三层是进行应用程序开发的基础,也是本书涉及的主要内容,这一层的组件将在以后的章节中详细介绍。
第四层为用户应用程序层,这一层的软件包括欢迎界面(Home)、联系人(Contacts)、电话(Phone)、浏览器(Browser)等用户直接使用的程序,当然也包括用户自己开发的应用程序。本书将详细介绍该层应用程序的设计方法。
1.3Android开发平台
1.3.1基于Windows的Android开发平台
组建Android开发平台需要的软件有四种,即JDK(JavaDevelopmentKit)、Eclipse、ADT(AndroidDevelopmentTools)插件、AndroidSDK(SoftwareDevelopmentKit)。令人欣慰的是,所有这些软件都可以免费获得和使用。
为了使组建平台的过程条理性比较强,下面按安装步骤依次介绍,每一步用“S+顺序号”表示,例如第一步用S1表示。笔者使用的计算机操作系统为32位WindowsXP专业版SP3,但是下面介绍的步骤适用于更高版本的Windows操作系统,即这里介绍的安装步骤具有通用性。建议读者使用最新的Windows操作系统。
S1.安装JDK软件
如果要在Windows操作系统下运行和开发Java程序,必需安装JDK(JavaDevelopmentKit),JDK包含了JRE(JavaRuntimeEnvironment)。如果只想在Windows系统下运行Java应用程序,则只需要安装JRE。
登录/technetwork/java/javase/downloads/index.html下载JavaSEDevelopmentKit6u24(JDK),文件名为“jdk-6u24-windows-i586.exe”,大小约为76.58MB。进入到该网页的超链接“InstallationInstructions”(安装向导),可以阅读详细的安装方法。本书所用的JDK软件版本为截止2011年4月中旬时的最新版本。JDK软件的更新比较快,建议读者安装最新版本的JDK软件。双击下载后的程序图标“jdk-6u24-windows-i586.exe”,即进入安装JDK的过程。笔者采用了缺省的安装目录“C:\ProgramFiles\Java\jdk1.6.0_24\”,安装过程中将提示安装JRE,笔者采用了缺省目录“C:\ProgramFiles\Java\jre6”。一般地,计算机将在2分钟内完成安装,然后进入到“所有程序|附件|命令提示符”窗口,输入“java-version”,将显示如图1-4所示结果,表明安装JDK软件成功。图1-4显示JDK版本号窗口
S2.安装Eclipse软件
登录/下载Eclipse软件,网站上的各个EclipseIDE(集成开发环境)均可以使用,这里推荐使用EclipseIDEforJavaEEDevelopers或EclipseClassic3.6.2。笔者使用EclipseIDEforJavaEEDevelopers,文件名为“eclipse-jee-helios-SR2-win32.zip”,大小约为206MB,截止到2011年4月中旬的最新版本号为4.1。建议读者下载最新版本的Eclipse软件。该软件无需安装,解压后即可运行,笔者将其解压到D盘,如图1-5所示,启动文件名为“eclipse.exe”。图1-5Eclipse软件包双击图1-5中的图标“eclipse.exe”,第一次使用时会弹出如图1-6所示窗口。在“Workspace”中填入一个路径,笔者使用“D:\myWorkspace”这个路径,或者使用图1-6右边的“Browse…”按钮选择其他已存在的路径。然后,选中“Usethisasthedefaultanddonotaskagain”复选框,在以后运行Eclipse软件时默认的工作区保存目录为“D:\myWorkspace”,将不再弹出该启动窗口。图1-6选择工作区目录点击图1-6中的“OK”按钮进入到Eclipse软件主界面,如图1-7所示。图1-7Eclipse软件主界面
S3.安装ADT插件
在图1-7中选择菜单项“Help|InstallNewSoftware…”,进入到图1-8所示的窗口,在“Workwith”栏中输入/android/eclipse/。然后,点击右边的“Add...”按钮,在弹出的“AddRepository”对话框的“Name”栏中输入“ADT”(此处可以输入其他读者想要的名称),然后点击“OK”按钮,进入到图1-9所示界面。图1-8安装新软件图1-9安装新开发工具在图1-9中显示了最新版本的ADT开发工具,选中所有的开发工具,然后点击“Next”按钮进行ADT的安装。安装完成后,在菜单“Window”中多了一个子菜单项“AndroidSDKandAVDManager”,如图1-10所示。图1-10ADT安装完成后的界面
S4.安装AndroidSDK
登录到网站,找到页面上的超链接“SDK下载”,进入之后找到“Android2.3SDK下载”下载SDK包,文件名为“android-sdk_r08-windows.zip”,约有31.1MB,笔者将其解压到D盘的根目录下,如图1-11所示。双击图1-11中的可执行文件“SDKManager.exe”,联网在线安装最新的AndroidSDK(截止2011年4月最新版本为Android3.0Revision1,本书中使用的版本为2.3.3Revision1),如图1-12所示。笔者安装了所有可用的SDK包,事实上,只安装所需要的SDK包就可以了,这里推荐读者只安装最新的SDK包。图1-12显示SDK的安装目录为D:\android-sdk-windows,安装完成后如图1-13所示,此文件约有1.02GB。图1-11AndroidSDK文件夹图1-12AndroidSDK安装过程图1-13AndroidSDK安装后的界面图1-13中的“SDKPlatformAndroid2.3.3,API10,revision1”为本书采用的SDK包,在图中标有选中的横条。
上述的步骤S1~S4完成了Android开发平台所需要的四个软件的安装,D盘根目录下会多出三个新目录,如图1-14所示。其中,android-sdk-windows为AndroidSDK软件,eclipse目录为eclipse集成开发环境,myWorkspace为存储用户应用程序工程文件的目录。下面的步骤S5~S6为配置和使用Android模拟器的操作过程。图1-14D盘上与Android开发相关的目录
S5.配置模拟器AVD(AndroidVirtualDevice)
双击文件“D:\eclipse\eclipse.exe”启动Eclipse软件(可以为该文件在桌面上建立一个快捷方式),如图1-15所示,点击菜单项“Window|Preferences”,进入图1-16所示窗口。在图1-16中的“SDKLocation:”一栏中输入AndroidSDK的安装目录,笔者的安装目录为“D:\android-sdk-windows”,然后点击“Apply”按钮,则在图1-16的列表框中显示出所有可用的SDK,接着点击“OK”按钮完成SDK的装配(这里的“Preferences”一般译为“参数配置项”)。图1-15Window菜单图1-16配置AndroidSDK点击图1-15中的菜单项“Window|AndroidSDKandAVDManager”或单击图1-17中的快捷按钮“OpenstheAndroidSDKandAVDManager”(在图中是一个机器人图标),都将弹出图1-18所示的窗口。图1-17打开模拟器快捷方式图1-18模拟器管理器在图1-18中点击“New”按钮,进入图1-19所示界面。在图1-19中填入模拟器的名字“Name”为“myAVD233”(这个名称可以随意取);在“Target”中选取“Android2.3.3–APILevel10”,表示模拟器搭载Android2.3.3系统;在“SDCard”中输入64,表示模拟器装备了64MB的SD卡,这个数值不能太大,模拟器使用硬盘文件来模拟SD卡,如果SD卡的容量太大,则读写速度比较慢;“Skin”表示模拟器屏幕,可以随意选取,这里使用缺省的WVGA800屏,分辨率为480 × 800。在图1-19中点击“CreateAVD”按钮,进入图1-20所示窗口。图1-19创建新的模拟器图1-20创建了一个名为myAVD233的模拟器管理器可以通过如图1-18和图1-19所示的界面创建多个不同名称的模拟器,它们会显示在图1-20的列表框中,这里只创建了一个模拟器myAVD233。在图1-20中选中myAVD233模拟器,点击“Start…”按钮,将弹出一个小的模拟器启动设置窗口,如图1-21所示。当图1-21中的复选框“Wipeuserdata”被选中时,表示启动模拟器后清除用户过去使用时创建的程序和数据,保持一个“干净”的模拟器环境。单击“Launch”按钮将弹出模拟器,等待几分钟后出现如图1-22所示Android2.3.3模拟器窗口界面。图1-21模拟器启动窗口图1-22Android2.3.3模拟器窗口界面
S6.Android模拟器使用体验
通过图1-22可以体验Android2.3.3的各项功能。使用Eclipse开发的在Android模拟器中合法运行的应用程序,可以直接部署到显示分辨率相同的Android移动设备上。一般地,需要根据应用程序开发者的移动设备(或智能手机)的Android系统版本和显示分辨率来设置模拟器。
这里使用SDK工具软件创建一个SD卡文件zySD64.img;然后重新建立一个基于该SD卡文件的模拟器myAVD233SD64;接着,通过Eclipse向SD卡中拷入一首歌曲;最后,在模拟器中运行“Music”应用程序播放这首歌曲。
在命令提示符窗口下进入到目录D:\android-sdk-windows\tools中,输入如图1-23所示命令行,创建64MB大小的文件名为zySD64.img的SD卡文件(标签为zySD)。图1-23创建SD卡文件图1-23中,“mksdcard/?”命令行为显示命令“mksdcard”的用法;命令行“mksdcard–lzySD64MzySD64.img”为创建SD卡的命令。创建的文件zySD64.img位于目录“D:\android-sdk-windows\tools”下。
按照前述的图1-18和图1-19再次创建一个新的模拟器,图1-19替换为图1-24。在图1-24中“SDCard”一栏中选择文件“D:\android-sdk-windows\tools\zySD64.img”,模拟器的名称为“myAVD233SD64”,其余设置与图1-19相同。图1-24创建使用外部文件zySD64.img作为SD卡的模拟器在图1-24中点击“CreateAVD”按钮后,显示界面如图1-25所示。图1-25中两个模拟器的唯一区别在于:模拟器myAVD233关闭后再次启动时,其SD卡的内容会丢失;模拟器myAVD233SD64的SD卡内容不会丢失,而是保留在文件zySD64.img中。图1-24中的“Deviceramsize”可以由256调整到512,其上面一行的数字“24”可以调整为“48”。图1-25具有两个Android模拟器的模拟器管理器在图1-25中选中模拟器“myAVD233SD64”,点击“Start…”按钮启动该模拟器。如果模拟器myAVD233仍然在运行中,那么此时的myAVD233SD64模拟器的电话号码将是“5556”,否则仍然是“5554”。
在Eclipse集成开发环境主界面(见图1-17)下选择菜单“Window|ShowView|Other…”或点击右上角的“OpenPerspective”快捷按钮,如图1-26所示。在图1-26中点击其右上角弹出菜单的“Other…”项,然后弹出“OpenPerspective”窗口,选中其中的DDMS项,再点击“OK”按钮进入图1-27所示界面。DDMS是DalvikDebugMonitorService的首字母缩写,即调试监视服务器,用于调试程序、检测进程和堆信息、显示LogCat信息(使用Logcat命令显示的程序实时运行信息)、模拟信息和电话功能、虚拟地理坐标等,下面将借助DDMS向SD卡中拷入数据文件。图1-26打开DDMS视图的操作图1-27DDMS界面重新启动模拟器zyAVD233SD64,在应用程序界面(即点击图1-22中下方的16个小方块堆后进入的界面)依次选择“Settings|Language&Keyboard|SelectLanguage|中文简体”可将模拟器界面设置为中文。在应用程序界面点击“音乐”图标,则进入图1-28所示界面。图1-28音乐播放器应用程序的工作界面1.3.2基于Ubuntu的Android开发平台
S1.安装Ubuntu操作系统
在Windows系统下,在网站/上下载Ubuntu操作系统,笔者下载的版本为UbuntuDesktopEdition10.1064-bit版,建议读者下载最新版本的64位Ubuntu系统。下载后的文件名为ubuntu-10.10-desktop-amd64.iso,将其加载到虚拟光驱中。然后,在网站http:///上下载wubi.exe文件,该可执行文件用于在当前Windows系统下安装Ubuntu系统。运行wubi.exe文件即可完成Ubuntu系统的安装,重新启动电脑,将出现提示要求选择操作系统。选中“Ubuntu”可进入Ubuntu系统,选中“MicrosoftWindowsXPProfessional”则进入WindowsXP系统(笔者使用的是Windows系统)。
S2.安装EclipseSDK集成开发环境
进入到Ubuntu系统后,可以通过“UbuntuSoftwareCenter”直接安装Eclipse,简单方便。也可以采用另一种方法,即使用Ubuntu系统的FireFox浏览器登录网站http:///,下载EclipseClassic3.6.1Linux64-bit版本,建议读者下载最新版本的基于64位Linux的Eclipse,下载后的文件名为eclipse-SDK-3.6.1-linux-gtk-x86_64.tar.gz。解压后的文件存放在目录…/myeclipse/下,myeclipse是笔者创建的目录,如图1-29所示。运行图1-29中eclipse目录下的eclipse可执行文件即可启动EclipseSDK软件,将该启动文件发送到桌面建立快捷连接方式“Linktoeclipse”。图1-29Eclipse软件目录
S3.安装AndroidSDK
从网上下载android-sdk_r08-linux_86.tgz,将其解压到…/myeclipse下,如上图1-29所示。运行…/myelipse/android-sdk-linux_86/tools/android,在线安装的完整AndroidSDK大约有1.6GB。
在Ubuntu系统下,点击“System|Administration|SynapticPackageManager”进入图1-30所示界面并安装“ia32-libs”组件,该组件是在64位Ubuntu系统中执行32位应用程序的运行支持库。图1-30安装ia32-libs
S4.安装ADT插件
启动Eclipse软件,如图1-31所示,与Windows下的Eclipse界面不同的地方在于其软件的“关闭”、“最小化”和“最大化”控制按钮位于窗口的左上角,而不是右上角。Eclipse软件的Help菜单如图1-32所示,点击“Help|InstallNewSoftware…”进入到图1-33所示界面,在图1-33的“Workwith”栏中输入“/android/eclipse”,按下回车键后下面的列表框中将出现“DeveloperTools”,选中“DeveloperTools”,点击“Next>”按钮安装ADT插件。安装完成后,Eclipse软件菜单“Window”中多了一项子菜单“AndroidSDKandAVDManager”,如图1-34所示。图1-31Eclipse软件界面图1-32Eclipse软件的Help菜单图1-33安装ADT插件图1-34Eclipse软件Window菜单
S5.启动Android模拟器
在图1-34中点击菜单项“Window|Preferences”对AndroidSDK进行配置,之后点击“Window|AndroidSDKandAVDManager”弹出图1-35所示窗口。在图1-35所示界面中点击“New…”按钮弹出图1-36所示窗口,在图1-36中配置一个新的模拟器,名称为myAVD233,它基于Android2.3.3–APILevel10,内置64MB的SD卡,使用HVGA显示屏。然后,点击“CreateAVD”按钮进入图1-37所示窗口。在图1-37中,提示HVGA为320×480的分辨率,点击右下角的“Launch”按钮将创建一个新的模拟器myAVD233,如图1-38所示。在图1-38中选中“myAVD233”模拟器,然后,点击“Start…”按钮启动该模拟器,如图1-39所示。尽管图1-39与图1-22的显示分辨率不同,但它们本质上是相同的,模拟器中集成了一些常用的应用程序,可以在图1-39中体验Android系统特色及其应用软件的操作特点。图1-35Android模拟器管理器图1-36配置模拟器图1-37模拟器加载选项图1-38具有一个名为myAVD233模拟器的模拟器管理器图1-39Android模拟器myAVD233
S6.HelloWorld工程
事实上,使用基于Ubuntu系统的Eclipse软件和基于Windows系统的Eclipse软件创建Android应用程序的方法完全相同,这里给出在Ubuntu系统下使用Eclipse软件开发Android应用程序的过程,而本书后面介绍的应用程序开发均基于Windows系统下的Eclipse集成开发环境。此处对HelloWorld应用程序的代码和工作原理不进行介绍,而在第三章介绍基于Windows系统的Eclipse软件的使用时将深入介绍该应用程序的源代码和工作原理。
在Eclipse软件界面(见图1-31)下,点击菜单“File|New|Project.”,弹出如图1-40所示窗口。图1-40新建工程向导在图1-40中选择“AndroidProject”,然后点击“Next>”按钮,弹出如图1-41和图1-42所示界面。这两幅图是同一个图,由于图幅内容过多,因此用两个图分别表示垂直滚动条的不同位置。在图1-41所示界面中的“Projctname”栏输入“uMyHello”,即工程名为uMyHello,然后选中“Createnewprojectinworkspace”,即在工作区中创建新工程。在图1-42中选择“Android2.3.3”作为目标平台,然后依次输入应用名称、包名称、活动名称为“myHello”、“my.uap.pack”和“MyHello”,最后点击“Finish”按钮完成创建新工程向导,进入图1-43所示窗口。图1-41创建新工程(1)图1-42创建新工程(2)图1-43uMyHello工程界面在图1-44中选择菜单“Run|RunAs|AndroidApplication”,则模拟器中可显示出该应用程序的执行结果,如图1-45所示,显示“HelloWorld,MyHello!”字符串。图1-44“Run”菜单图1-45模拟器运行结果 1.4小结
Android系统是基于Linux内核的嵌入式操作系统,与WindowsCE等嵌入式操作系统一样,Android系统主要针对智能手机和移动设备,具有体积小、实时性强、功耗低和界面人性化等优点。Android系统采用分层结构,与硬件直接接触的底层为Linux内核(第一层),其上为Android系统库和Android应用程序运行环境(第二层),第三层为Android应用程序框架,直接与用户交互的顶层为应用程序层(第四层)。与其他嵌入式操作系统相比,Android系统的最大优势在于两方面,即公开源代码和免费使用。此外,Android系统的安全性和网络功能非常强大,因此Android系统很适合用于教学和科研。可以借助Windows系统或Ubuntu系统开发Android应用程序,如果基于Ubuntu系统开发Android应用程序,需要使用的开发软件即Eclipse、JDK、AndroidSDK、ADT等均是免费的,这一特点极大地推动了Android应用程序设计的普及。Android系统模拟器的功能十分强大,基于模拟器运行良好的应用程序均可以在真实的移动设备上良好地运行。第2章Java语言2.1Java程序语法与控制
2.2Java基本数据类型
2.3Java类
2.4Java文件操作
2.5在命令行窗口中运行Java程序2.6Java图形界面2.7小结
2.1Java程序语法与控制
Java程序文件的扩展名为 .java,每个程序文件中只能包含一个public类,即公有类,public是可见性修饰符,用public定义的类、方法(或称函数)或数据域(或称变量)可以被任何类访问。Java程序的入口点是main方法,定义在公有类中,main方法的原型为
publicstaticvoidmain(String[]args){}
与其他高级语言程序设计相同,Java语言程序具有三种基本的程序控制方式,即顺序、分支(或选择)和循环执行方式,在main方法中可使用三种程序控制方式进行程序设计。2.1.1顺序方式
顺序方式是指Java语句按照先后顺序依次执行并得到计算结果的程序执行方式,这是Java语言的总体执行方式(由于类只是数据结构,因此类中定义成员数据和方法时不分先后,成员方法中的变量必须先定义后使用)。下面的例2.1为输入一个摄氏温度值,将其转化为华氏温度值。通过该例详细介绍借助Eclipse编写Java程序的步骤,本章中所有实例的创建步骤也都与此类似,因此后面实例的创建步骤就省略了。
例2.1
摄氏温度值转化为华氏温度值。
摄氏温度值转化为华氏温度值的关系式为
Fah=1.8×Cel+32
上式中,Fah表示华氏温度,Cel表示摄氏温度。下面分步骤介绍该实例的实现方法。
S1.创建工程ex02_01
在Eclipse软件主界面(见图1-7)中,选择菜单项“File|New|JavaProject”,弹出如图2-1所示界面。在图2-1中输入工程名为“ex02_01”,保存在目录“D:\myWorkspace\ex02_01”下,然后直接点击“Finish”按钮完成创建工程向导,如图2-2所示。在图2-2中,显示了空的工程ex02_01,其中包含一个“src”标签,该标签下存放Java源程序文件,此外,还包含了JRESystemLibrary,即Java程序运行环境库。在图2-2界面中,点击菜单项“File|New|Class”即可添加新类,进入图2-3所示界面。图2-1新建Java工程界面图2-2空的工程ex02_01图2-3创建新Java类在图2-3中输入包名为“cn.jxufe.zhangyong”,包(Package)的名称要求具有全球唯一性。包是类的容器,允许不同包中存在相同名称的类。包类似于C#语言中的命名空间,在引入了包的概念后,不同的程序员在命名类名时可以更加随意且不会导致类名冲突。这里的包名“cn.jxufe.zhangyong”表示“中国.江西财经大学.张勇”,包名一般从大地名至小地名依次书写,名称间用“点号”分开,以这种命名规范命名的包可有效地防止同名包的出现,本章中的所有实例均使用包名“cn.jxufe.zhangyong”,因此必需保证这个包里面没有同名的类出现。然后,输入类名为“MyEx0201”,类的命名习惯要求首字母大写。接着,点击“Finish”按钮完成创建Java类向导,进入图2-4所示界面。图2-4“Helloworld!”程序代码
S2.控制台显示“Helloworld!”
在图2-4中输入Java程序代码如下:
1packagecn.jxufe.zhangyong;
2
3publicclassMyEx0201{
4 publicstaticvoidmain(String[]args){
5 System.out.println("Helloworld!");
6 }
7}
S3.摄氏温度转换为华氏温度的示例程序
图2-4是一个完整的程序,输出“Helloworld!”信息,为了实现摄氏温度转换为华氏温度的功能,改写程序文件MyEx0201.java的代码如下:
1packagecn.jxufe.zhangyong;
2
3publicclassMyEx0201{
4 publicstaticvoidmain(String[]args){
5 doubleCel=36.5;
6 doubleFah;
7 Fah=1.8*Cel+32.0;
8 System.out.println(Cel+"deg.C="
9 +Fah+"deg.F.");
10 }
11}
上述代码中,第5行定义双精度浮点数变量Cel并初始化为36.5,第6行定义双精度浮点数变量Fah,第7行根据公式计算新的Fah的值,第8、9行调用方法System.out.println在控制台输出信息“36.5deg.C=97.7deg.F.”,如图2-5所示。
图2-5所示工程是一个简单的Java顺序执行程序示例,第5~9行的语句按先后顺序依次执行,程序的顺序执行方式是最基本的程序控制方式。图2-5温度转换程序及输出结果2.1.2分支方式
分支方式是根据条件关系式的逻辑值进行判断,有条件地执行某些语句组。有两种条件语句,即if-else语句和switch语句,其基本语法分别为:
if(布尔表达式){
布尔表达式为真时执行的语句组;
}
else{
布尔表达式为假时执行的语句组;
}
和当表达式的值不等于上述的“值1”、“值2”、…、“值N”时执行的语句组;
}
if语句和switch语句均可以嵌套,下面的例2.2和例2.3分别介绍了这两种条件语句的使用方法。
例2.2
求解一元二次方程的根。
已知一元二次方程ax2 + bx + c = 0,任意输入三个系数a、b和c,计算未知数x的值。新建工程ex02_02,在工程ex02_02中新建类MyEx0202(对应的文件名为MyEx0202.java,即类名与文件名相同,所在的包为cn.jxufe.zhangyong)。MyEx0202.java文件的程序代码如下所示:在C语言中使用库函数时需要借助于include关键字,在C#中使用use关键字。在Java程序中,如果需要调用其他包中的类所包含的公有方法和数据时,必需借助于import关键字导入这些包和类,如上述程序段中的第3~5行。第3~4行为第20~21行的方法服务,第5行为第12行的方法服务。导入一个包(和包中的某个类)非常方便,例如,在程序中书写了“Scannerscanner=newScanner(System.in);”语句后,会自动提示程序员导入java.util.Scanner,只需要在提示的右键弹出菜单中点一下就会在第5行添加“importjava.util.Scanner;”语句。因此,所有的import语句都是用这种方法创建的,不需要程序员书写,比起C语言的“#include”包括头文件语句更加方便。上述程序段的main方法代码为第9~34行。第9行定义三个double型变量a、b和c;第10行定义了一个具有两个元素的double型数组x,必须记住Java这种定义数组的方法,使用new关键字为元素个数开辟空间;第11行在控制台输出提示信息“Input3coefficients:”;第12行用类Scanner创建一个scanner对象,同时用类Scanner的构造方法对它进行初始化(在第2.3节中将详细介绍构造方法);第13~15行调用scanner对象的方法nextDouble从控制台读入双精度浮点数,并分别赋给变量a、b和c;第16行判断a的绝对值是否小于0.00000001,即判断a是否为0。如果表达式Math.abs(a)<1e-8为真,则认为a = 0,于是第17行输出“Notaquadraticequation!”,说明不是一元二次方程;否则,程序执行第19~34行代码。第20~21行用类DecimalFormat创建一个对象df;第21行调用对象df的方法setMaximumFractionDigits设置小数显示时保留2位小数,即当调用对象df的方法format时,将方法format的输入参数设置为只显示2位小数(见第25行)。第22行判断b*b>=4*a*c是否为真,如果为真,则方程的两个根x[0]和x[1]均为实数(数组的下标从0开始索引);第23~24行计算两个根的值;第25~26行在控制台输出两个根的值,为使输出的根只保留两位小数,使用方法df.format格式化输出。如果b*b>=4*a*c为假,则执行第29~32行代码,此时两个根为复数,用x[0]存放根的实部,x[1]存放根的一个虚部,第31~32行在控制台输出这两个复根。图2-6和图2-7给出了例2.2的两次执行结果,说明程序工作正常。其中使用if-else语句的两级嵌套实现了一元二次方程的求根运算。图2-6实例2.2运行结果:a = 2、b = 5和c =-4图2-7实例2.2运行结果:a = 3、b = 7和c = 6
例2.3
人民币兑换外币计算。
假设已知英镑(pound)、港币(HKD)、美元(dollar)、日元(yen)、欧元(euro)和新加坡元(SGD)对人民币的汇率分别为10.62、0.84、6.53、0.078、9.42和5.22,输入人民币可计算得到其兑换的外币值。新建工程ex02_03,在工程ex02_03中新建类MyEx0203(对应的文件名为MyEx0203.java,所在的包名为cn.jxufe.zhangyong)。MyEx0203.java文件的程序代码如下所示:图2-8和图2-9给出了例2.3的两次执行结果,分别是将1000元人民币兑换成153.14美元和将2000元人民币兑换为383.14新加坡元,这说明程序运行正常。例2.3说明了switch语句的用法,从例2.3可以体会到,switch语句实现的程序控制,if-else语句也能实现。图2-8例2.3程序运行结果(1000元兑换美元)图2-9例2.3程序运行结果(2000元兑换新加坡元)2.1.3循环方式
Java语言提供了三种循环控制语句,即while型、do-while型和for型循环,这三种循环控制语句与C语言的语法相同,其基本语法如下:
while(条件表达式){
条件表达式为真时执行的语句组(即循环体);
}
Do{
循环体(先执行一次后判断条件表达式的值,如果为真则再次执行循环体;与while型的区别在于当条件表达式为假时,循环体可被执行一次);图2-10为例2.4的执行结果。图2-10例2.4程序运行结果
例2.5
计算九九乘法表。
例2.5使用for型循环方式计算九九乘法表。新建工程ex02_05,在工程ex02_05中新建类MyEx0205(对应文件名为MyEx0205.java,所在的包为cn.jxufe.zhangyong)。MyEx0205.java文件的程序代码如下所示:上述代码的输出结果如图2-11所示。第5~10行嵌套了两个for型循环,外层的for型循环中i从1步进到9,步长为1,表示图2-11中的第1至9行;第6~8行的for型循环从1步进到i,步长为1,表示图2-11中的第1至i列。九九乘法表中第i行第j列的乘法算式为计算i和j的乘积,如图2-11所示。若i等于6,j等于5,即第6行第5列的式子为“6*5=30”,于是循环执行第7行输出九九乘法表中的每个乘法式子。第9行表示每输出一行后添加一个回车换行。图2-11例2.5计算的九九乘法表2.1.4异常处理
异常处理也是一种程序控制方式。当程序运行过程中产生了错误(例如,数值溢出、输入无效、数组越界等),即所谓的运行错误,往往会导致整个程序运行突然中断或退出,而程序员无法知道程序退出的原因。异常处理的作用在于当程序运行发生错误时,捕捉运行错误类型(称为异常),并能保证程序仍然正常执行。Java异常处理的功能十分强大,其基本用法为:当try“被监视的语句组”中的某条语句发生异常时,其后的程序不再执行,而是跳到catch语句处,依次判断各个catch的异常类型是否与发生的异常相匹配,如果匹配,则将发生的异常(对象)赋给catch语句,执行该catch块中的语句。无论异常是否发生,都要执行finally语句块中的全部语句,这部分语句一般用作内存释放和关闭已打开的文件对象等。
例2.6
整数除法(除以0)和输入类型不匹配异常。
从控制台输入两个整数,计算它们的商。新建工程ex02_06,在工程ex02_06中新建类MyEx0206(对应文件名为MyEx0206.java,所在的包为cn.jxufe.zhangyong)。MyEx0206.java文件的程序代码如下所示:图2-12~图2-14显示了例2.6的运行结果,图2-12为正常运行,图2-13因为输入出现了浮点数12.2而发生输入类型不匹配异常,图2-14因输入除数为0而发生除以0异常。图2-12例2.6运行结果(无异常)图2-13例2.6的运行结果(输入类型不匹配异常)图2-14例2.6的运行结果(除以0异常) 2.2Java基本数据类型
2.2.1数值
数值类型包括整数类型和浮点数类型,整数类型包括四类,即字节byte、短整型short、整型int和长整型long,依次占有存储字节数为1、2、4和8;浮点数类型包括两类即单精度浮点数型float和双精度浮点数型double,分别占有存储字节数为4和8。double和float都用来表示小数,为了区分这两种表示,float型小数后面需要添加“f”或“F”,即0.53F被视为float型,而0.53被视为double型。各种数值类型间可以进行强制类型转换,这一点与C语言相同,例如,“inti=(int)15.3;”将double型数15.3强制转化为整型数15。强制类型转换也称为显式转换,当一个表达式中出现了int型和double型时,则自动将int型转换为double型进行计算,这种类型转换称为隐式转换,例如,3/6.0将得到0.5。
与数值类型数据相关的Java算术运算符包括加、减、乘、除和求余,即“+”、“-”、“*”、“/”和“%”;Java赋值运算符为“=”;与C语言相同,Java语言支持自增和自减运算符,即“++”和“--”;Java语言支持复合赋值运算符,即“+=”、“-=”、“*=”、“/=”和“%=”。注意,复合运算符中的两个基本运算符间没有空格,例如“+=”是不正确的复合运算符。
例2.7
数值类型演示。
新建工程ex02_07,在工程ex02_07中新建类MyEx0207(对应文件名为MyEx0207.java,所在的包为cn.jxufe.zhangyong)。MyEx0207.java文件的程序代码如下所示:上述代码中,第5行定义byte型变量a1并初始化为0xF1(十六进制数形式),由于Java不支持无符号型数,因此a1为-15。第6行定义short型变量a2并初始化为0xF001,此时a2等于-4095。第7行定义整型变量a3,由于a3占4个字节,这里0xF001相当于0x0000F001,因此a3为61441。第8行定义长整型变量a4,这里使用隐式转换,a4等于61441。第9行定义double型变量b1并赋初值3/6.0,即0.5。第10行定义float型变量b2并赋初值为15.3000001。第11行定义double型变量b3并赋初值15.3000001。第14~15行输出各个整型数变量的值。第16~17行输出各个浮点数变量的值,如图2-15所示。从图2-15中可以看出,float型数b1的精度比double型数b2的精度低,b1无法精确识别15.3000001。图2-15例2.7输出结果2.2.2字符
Java支持Unicode码,即用两个字节表示的字符,Unicode码(常被译为统一码)包含了ASCII码,几乎可以表示地球上现有的所有人类语言符号。因此,一个Java字符占2个字节。定义的字符用两个单引号括起来,例如“charch1='A';”。如果字符不是ASCII,可以使用该字符的Unicode码值来定义字符,例如“charch2='\u03b1';”,这里的03b1是十六进制形式表示的码值。与C语言相同,字符型数据支持自增和自减运算符。字符型数据与数值型数据可以相互转换,一般借助于显式转换方式。
例2.8
大写字母转换为小写字母。
例2.8执行结果为:输入一个大写字母,输出其对应的小写字母。新建工程ex02_08,在工程ex02_08中新建类MyEx0208(对应文件名为MyEx0208.java,所在的包为cn.jxufe.zhangyong)。MyEx0208.java文件的程序代码如下所示:上述代码中,第7行定义了一个控制台输入对象scanner;第8行在控制台输出提示信息“Inputaletter:”;第9行从控制台读入字符串的值并赋给字符串变量str,scanner不支持字符的读入;第10行从字符串str中提取第一个字符,赋给字符变量ch,这里使用了字符串的方法charAt。第11~13行判断字符ch是否为大写字母,如果第11行为真,即字符ch为大写字母,则第12行将其转化为小写字母。第14行输出转化结果,如图2-16所示。图2-16例2.8运行结果
Java语言中常用的转义字符如表2-1所示。表2-1Java语言常用转义字符2.2.3字符串
Java中声明字符串变量时使用String关键字(实际上是String类),字符串声明时需要初始化,字符串类型为引用类型(即字符串变量是指向字符串的地址),一旦创建后就不能更改字符串的值(注:可以在字符串尾部添加字符串)。如果要创建一个可以改变内容的字符串,需要借助StringBuffer类或StringBuilder类,这两个类都通过操作字符缓冲区来更改字符串的值,常用的方法有append、insert、substring、charAt、setLength、delete和toString等,它们分别表示追加字符串、插入字符串、定位部分字符串、定位字符串中的字符、设置字符串缓冲区的长度、删除部分字符串和返回字符串。
例2.9
字符串操作。
新建工程ex02_09,在工程ex02_09中新建类MyEx0209(对应文件名为MyEx0209.java,所在的包为cn.jxufe.zhangyong)。MyEx0209.java文件的程序代码如下所示:例2.9的运行结果如图2-17所示。图2-17例2.9运行结果2.2.4布尔数
Java语言中,逻辑真为true,逻辑假为false,而且只有这两个是布尔数。Java语言的布尔运算符如表2-2所示,参与布尔运算符的只能是布尔数。表2-2布 尔 运 算 符
Java语言的关系运算符如表2-3,关系运算符的结果为布尔数。表2-3关 系 运 算 符2.2.5数组
Java语言中定义数组的方法为“数据类型[]数组名;”,例如定义包含20个元素的double型一维数组arr,其定义为“double[]arr=newdouble[20];”或“double[]arr;arr=newdouble
[20];”,这一点与C++相同。也可以在定义数组时对数组进行初始化,例如,“double[]arr1={12.3,2.6,7.9,8.8};”,相当于语句组“double[]arr1=newdouble[4];arr1[0]=12.3;arr1[1]=
2.6;arr1[2]=7.9;arr1[3]=8.8;”。Java数组的下标从0开始索引。
Java语言也可以定义高维数组,例如,“double[][]arr2=newdouble[4][5]”定义了一个4行、5列的二维数组,第一个元素的脚标为[0][0],最后一个元素的脚标为[3][4]。对于Java数组,可以使用foreach循环方法遍历数组中的所有元素,可以借助Arrays类中的方法处理数组元素,如例2.10所示。
例2.10
数组演示实例。
例2.10的功能为:产生10个随机数,对它们按从小到大的顺序进行排序,并计算它们的和。新
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度环保型窗帘定制与施工一体化合同
- 二零二五年度电影演员经纪与市场推广聘用合同
- 二零二五年度船舶动力车辆质押担保合同
- 二零二五年度员工股权激励计划实施与员工晋升协议
- 二零二五年度高空作业安全责任免除与培训协议
- 2025年度旅游观光车租赁期限延长及导游服务补充协议
- 二零二五年度辣椒产业扶贫项目资金管理与审计合同简约版
- 二零二五年度房地产合同转让协议范本汇编
- 二零二五年度新材料研发股东入股合同
- 2025年度演员经纪代理协议-经纪公司全面合作协议
- 变压器更换施工方案
- 【高分复习笔记】陈澄《新编地理教学论》笔记和课后习题详解
- 安徽新宸新材料有限公司年产6000吨锂离子电池材料双氟磺酰亚胺锂项目环境影响报告书
- 日本酒类消费行业市场分析报告
- GB/T 29594-2013可再分散性乳胶粉
- 西子奥的斯电梯ACD2调试说明书
- 成长感恩责任高中主题班会-课件
- 化工装置实用操作技术指南
- 建设项目全过程工程咨询服务指引(咨询企业版)(征求意见稿)
- 分手的协议书模板(5篇)
- 2020年度安徽省中考数学科目试卷
评论
0/150
提交评论