620 likes | 770 Views
解读程序项目架构. Android 智能手机开发 2011.09. 第一个应用程序: helloworld. 第一步:创建新项目,并将这个项目名称定为 helloworld. 字段说明: Project name: 这个项目所在的文件夹名称 Application name: 应用程序显示在屏幕上的标题 Package name: 包名称。 Java 的习惯是用不同的包名来区分不同的类。依照项目的不同,我们会取不同的路径名称。 Build target: 选择用来编译项目的 SDK 配置. 应用程序的基本文件架构.
E N D
解读程序项目架构 Android智能手机开发 2011.09 湖南城市学院
第一个应用程序:helloworld • 第一步:创建新项目,并将这个项目名称定为helloworld 湖南城市学院
字段说明: • Project name:这个项目所在的文件夹名称 • Application name:应用程序显示在屏幕上的标题 • Package name:包名称。Java的习惯是用不同的包名来区分不同的类。依照项目的不同,我们会取不同的路径名称。 • Build target:选择用来编译项目的SDK配置 湖南城市学院
应用程序的基本文件架构 • 新建项目后,会创建不少文件,一个应用程序的基本文件架构如下: 湖南城市学院
1、src/:源代码目录 • src目录中包含了一个android应用程序所需的各个程序源文件。 • 以helloworld程序为例,src目录中比较关键的程序是helloworld.java 湖南城市学院
src/:源代码目录 • helloworld.java这个文件的名称会随着我们创建项目窗口中所填入create Activity字段值的不同而不同。 • helloworld.java是新程序项目中的主要程序块。 • Activity类文件 • 我们开发应用程序的多数时间,都是在和src目录下的程序源文件与res目录下的XML描述文档打交道 湖南城市学院
预先已创建好的基本程序逻辑。其内容如下: 湖南城市学院
helloworld.java package com.demo.android.helloworld; • 这一行的作用是指出这个文件所在的命名空间。不同的人写程序可能出现变量重名现象,为了解决这个问题引进命名空间这个概念,你所使用的库函数或变量都在这个命名空间中定义,这样就不会出现变量或库函数冲突。 • package(包)是其关键字。Java的package设计成与文件系统结构相对应,如我们的package设置值是com.demo.android.helloworld,则这个类就该在制定目录的com/demo/android/helloworld路径下可以找到。 湖南城市学院
helloworld.java • 同时也别忘了java程序语言每段代码语句的结尾处,与大部分程序语言一样需加上一个分号“;”,以表示一行程序代码的结束。 湖南城市学院
helloworld.java Import android.app.Activity; Import android.os.Bundle; • 程序默认导入android.app.Activity和android.Bundle两个Package,在所有的android应用程序中,都会用到这两个包。 • Import(导入)是用作导入Package(包)的关键字。 • 在java语言中,使用到任何API前都要事先导入相对应的Package。 湖南城市学院
helloworld.java Public class helloworld extends Activity{ • “helloworld”是这个类的名称,class则是用作声明类关键字。Public关键字是用来修饰helloworld这个类。表示helloworld是个公开的类,可以从package外部取用。 • extends Activity,则表示helloworld这个类的功能、类型等完全继承自Activity类。extends是继承类的关键字。Activity是来自我们刚才导入的包:android.app.Activity 湖南城市学院
类 例如:一个圆柱体类 class Cylinder { double radius;//声明成员变量radius int height; double pi=3.14 void area()//定义成员方法area(),用来计算底面积 { ……… } void volume()//定义成员方法volume()// ,用来计算体积 { ……… } } 湖南城市学院
类 • 每一个圆柱体Cylineler,无论尺寸大小,都有底半价和高两个属性,而这两个属性既是圆柱体的数据成员radius(半径)和height(高) • 在圆柱体类中,还将计算底面积与体积这两个函数纳入圆柱体类中。java语言称这种封装于类内的函数称为“方法”(Methods)。 • 注意:Java语言把数据成员称为属性;而把函数成员称为成员方法,简称方法 • 传统的程序设计语言里,计算面积与体积通常由独立的函数来处理,但在面向对象程序设计里,这些函数是封装在类之内的。 湖南城市学院
pi radius height area() volume () 成员变量 成员方法 图1 圆柱体类 湖南城市学院
类 • 类的定义 • 所谓类就是把事物的数据与相关功能封装(Encapsulate)在一起,形成一种特殊的数据结构,用以表达真实事物的一种抽象。 • Encapsulate原意是“将…..装入胶囊内”,现在的胶囊就是类,而成员变量与成员方法便是被封入得东西 • 在上例中,pi,radius,height是成员变量,area(),volume()是成员方法 湖南城市学院
对象 • 类与对象的关系: • 类是对某一类事物的描述,是抽象的、概念上的定义; • 对象则是实际存在的属该类事物的具体的个体。 • 下面用一个现实生活中的例子来说明类与对象的概念。图2所示的是一个“汽车类”与“汽车实例”的例子。 湖南城市学院
汽车设计图 第3辆 第1辆 第2辆 图2 汽车类与汽车的实例 湖南城市学院
创建对象 通过如下的两个步骤来创建对象: 声明指向“由类所创建的对象”的变量; 利用new运算符创建新的对象,并指派给前面所创建的变量。 例如,要创建圆柱体类的对象,可用下列的语法来创建 Cylinder volu; //声明指向对象的变量volu volu=new Cylinder(); //利用new创建新的对象,并让变量volu指向它 湖南城市学院
创建对象 另外在创建对象时也可以将上面的两个语句合并成一行,即在声明对象的同时使用new运算符创建对象。如: Cylinder volu=new Cylinder(); 湖南城市学院
对象的使用 创建新的对象之后,就可以对对象的成员进行访问。通过对象来引用对象成员的格式如下: <对象名>.<对象成员> 在对象名和对象成员之间用“.”相连,通过这种引用可以访问对象的成员。 例如,若将对象volu的半径赋值为2.8,把高赋值为5,其代码为: volu.radius=2.8; volu.height=5; 湖南城市学院
【例1】定义一个圆柱体类,并创建相应的对象,然后计算圆柱体的底面积与体积。【例1】定义一个圆柱体类,并创建相应的对象,然后计算圆柱体的底面积与体积。 湖南城市学院
class Cylinder //定义Cylinder类 { double radius; //定义成员变量radius int height; //定义成员变量height double pi=3.14; void area() //定义无返回值的方法area(),用来计算圆柱底面积 { ………………………….. } double volume () //定义返回值为double型的方法volume (),计算体积 { return (pi* radius* radius)*height; } } 湖南城市学院
public class app6_1 //定义公共类 { public static void main(String args[ ]) //程序执行的起始点 { Cylinder volu; volu=new Cylinder(); //创建新的对象 volu.radius=2.8; //赋值圆柱volu的底半径 volu.height=5; //赋值圆柱volu的高 ………………………………………. volu.area(); //输出面积 System.out.println(“圆柱体体积=”+volu.volume()); //输出体积 } } 湖南城市学院
继承 • 类的继承是面向对象程序设计的一个重要特点,通过继承可以实现代码的重用。 • 被继承的类称为父类,由继承而得到的类称为子类 湖南城市学院
class person • { • string name; • int age; • public void setNameAge() • {…… • } • } • class student extends person • { • string department; • void SetDepartment(string dep) • {….. • } • } 湖南城市学院
继承 • 此例person是父类,student是子类 • person类有成员变量name,age,方法SetNameAge();student有成员变量department,方法SetDepartment()。 • person类的成员都会被student类继承 湖南城市学院
package(包) • 利用面向对象技术开发一个实际的系统时,通常需要设计许多类共同工作,但由于Java编译器为每个类生成一个字节码文件,同时,在Java语言中要求文件名与类名相同,因此若要多个类放在一起,就要保证类名不能重复。 • 但当声明的类很多时,类名冲突的可能性很大,这时,就更需要利用合理的机制来管理类名。 • 为了更好地管理这些类,Java语言中引入了包的概念来管理类名空间 湖南城市学院
package(包) • 包的定义 • 所谓包,就是Java语言提供的一种区别类名空间的机制,是类的组织方式,每个包对应一个文件夹,包中还可以再有包。 • 在源程序中可以声明类所在的包,就像保存文件时要说明文件保存在那个文件夹中一样。 • 同一包中的类名不能重复,不同包中的类名可以相同 • 为了便于编程和管理,通常我们将需要在一起工作的类放在一个包中 湖南城市学院
package(包) • 创建包 • package语句是Java源文件的第一条语句,指明该文件中定义的类所在的包。 • 格式:package 包名1[.包名2[.包名3]…]; • 经过package的声明后,在同一文件内的所有类或接口都被纳入相同的包中 • Java编译器把包对应于文件系统的文件夹进行管理。同时,在package语句中用“.”来指明文件夹的层次 • package cgj.ly.myPackage; • 指明这个包的文件存储在文件夹cgj\ly\myPackage中。 • 实际上,创建包就是在当前文件夹中创建一个子文件夹,以便存放在这个包中包含的所有的.java文件 湖南城市学院
package(包) • 包与子包的定义,实际上是为了解决名字空间、名字冲突,它与类的继承没有关系。事实上,一个子类与其父类可以位于不同的包中 • 如果改变一个包名,就必须同时改变对应的文件夹名 • Java语言利用import语句引用Java定义的包 湖南城市学院
android.app.Activity • android.os.Bundle 湖南城市学院
public关键字 • 在面向对象语言程序设计中,设定一种机制来限制对成员的访问方式,避免安全上的漏洞。 • 对于类的话有 • 私有成员。定义方式:在类的成员声明的前面加上修饰符private。私有成员自能被该类自身访问和修改,而无法被该类的外部访问到 • 公有成员。定义方式:在类的成员声明的前面加上修饰符public。公有成员可以被所有其他的类所访问 湖南城市学院
class Cylinder { private double radius;//声明成员变量radius private int height; private double pi=3.14 void area()//定义成员方法area(),用来计算底面积 { return pi*radius*radius;//在类内可以访问私有成员radius和pi } public void SetCylinder(double r,int h) { ……… } } public class app_2 { public static void main(string[]args { Cylinder volu=new Cylinder(); volu.SetCylinder(2.5,-5); …….. } } 湖南城市学院
Activity • Activity是Android应用程序与用户互动的主要元素。当用户打开的一个应用程序,第一个看到的画面就是一个Activity。假如一个程序中包含多个画面时,会定义多个不同的Activity。 • Activity是最基本的模块,我们称之为“活动”,在一个应用程序中,一个Activity通常是一个单独的屏幕。 • 每一个活动都被实现为一个独立的类,并且从活动基类中继承而来。 湖南城市学院
Activity • Activity有四个状态: • 活动:Activity由用户启动,正在运行,并且在前台。在Android平台上,同一个时刻只会有一个Activity处于活动状态 • 暂停:Activity由用户启动,正在运行并且可见,但是一个通知或某个事件覆盖了屏幕的一部分。在这段时间,用户可以看大Activity,但不能与之交互。是退到背景画面的状态 • 停止:Activity由用户启动,正在运行,但被已启动或被切换到的其他Activity所隐藏。是其他Activity在执行,而这个Activity已经离开屏幕,不再动作的状态 • 死亡:Activity从未启动,或者Activity被手动终止了,或已经被系统回收的状态 湖南城市学院
配置Activity • Android应用要求所有的应用程序组件( Activity、Service、ContentProvider、BroadcastReceiver)都必须进行配置 湖南城市学院
2、AndroidManifest.xml 湖南城市学院
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=http://schemas.android.com/apk/res/android • AndroidManifest.xml这个文件是以xml格式描述,每个Android应用程序都需要一个AndroidManifest.xml文件。而且每份AndroidManifest.xml文件都会出现这段话。而整个AndroidManifest.xml文件的语句,都包含在“mainfest”这个主要标签中。 湖南城市学院
mainfest(列表)标签的属性 package="com.demo.android.helloworld" android:versionCode="1" android:versionName="1.0" • Package是manifest(列表)标签的一个特别属性,可以用来标明这个应用程序的进入点存在于“com.demo.android.helloworld”这个命名空间/路径中 • 应用程序版本号 • android:versionCode是开发者用的内部版本号 • android:versionName是用户看到的版本号 湖南城市学院
<application android:icon="@drawable/icon" android:label="@string/app_name"> • application标签,定义所有这个应用程序用到的Activity、服务等信息。 • application标签的属性 • android:icon=“@drawable/icon ” android:icon定义了这个应用程序将显示到Android手机主画面中的应用程序图标。 android:icon=“@drawable/icon “表示应用程序图标的资源文件存在于“res/drawable/icon”中 • android:label=“@string/app_name”用来指定应用程序将显示在主画面上的名称,名字即为“res/values/string.xml”中定义的字符串app_name 湖南城市学院
<activity android:name=".helloworld" android:label="@string/app_name"> • Activity标签的属性 • android:name=“.helloworld”指出这个Activity所对应的类(class)。”.helloworld”代表“com.demo.android.helloworld”的简称 • android:label=“@string/app_name“指定应用程序将显示在Activity画面上方的名称 湖南城市学院
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> • “intent-filter”标签定义了这个“Activity”的性质 • “intent-filter”中主要包含了两个标签:action和category标签 • android:name=“android.intent.action.MAIN”表示:这个Activity是此应用程序的进入点(就像程序中常见的main主程序),打开这个Activity时,应先执行这个Activity • android:name=“android.intent.category.LAUNCHER“表示这个Activity将会显示在Launcher的应用程序列表中。也就是默认开机时,可以从桌面下方拉出的应用程序列表。 湖南城市学院
AndroidManifest.xml • AndroidManifest.xml这个文件所表达的信息:在com.demo.android.helloworld路径下的helloworld.java这个文件中,已定义了一个主要的Activity;当我们打开Android的时候,显示的是位于res/drawable/icon的图标。一旦我们按下图标来启动这个应用程序,Android应用程序框架会去寻找到定义了android.intent.action.MAIN内容的“.helloworld”Activity,并调用执行。 湖南城市学院
helloworld.java /** Called when the activity is first created. */ • /* */是Java语言的多行注释符号,位于其中的文字内容不会被编译 • 顺便提下,“//”表示的是单行注释。只有与“//”符号同行的文字才不会被编译 @Override • @开头的语句表示装饰子语句,@override语句的作用是告诉程式我们要重写(override)这个oncreate方法。 湖南城市学院
helloworld.java Public void onCreate(Bundle savedInstancestate){ • onCreate方法是每个Activity类在初始化时都会去调用的方法。onCreate是这个方法的名称。Void则是声明了这个方法的返回值的类型。方法的返回值的类型即是这个方法的类型。onCreate这个方法使用void类型,表示onCreate这个方法不需要返回值。 • public关键字是用来修饰oncreate这个方法。表示onCreate是个公开的方法,可以在Bmi类外部调用。 湖南城市学院
helloworld.java • Bundle类是我们前面所导入的Package之一。Budle类可以保存Activity(活动)上一次关闭时的状态。 • Android应用程序运行、换背景等待、关闭时,都会用到savedInstanceState这个实体来处理内存相关的事宜。onCreat方法从savedInstanceState实体中得到前一次保存的状态。 湖南城市学院
helloworld.java Super.onCreate(saveInstanceState); • Super是关键字。代表这个helloworld类的上层类Activity。这句话的意思是:执行Activity类中的onCreate方法的内容。这么做的目的是因为将原本的onCreate方法内容保留,并在其中添加我们的内容。 • 执行原本的onCreate方法时,仍然需要提供原本onCreate方法所需的传入参数。因此这句话中,我们将savedInstanceState这个参数传入原本的onCreate函数中。 湖南城市学院