Android,陌生又熟悉的一个单词,说陌生是因为对Android,我几乎什么都不懂,说熟悉是因为我们几乎每天都在说这个词。初学Android,感觉还不是那么难,尤其是在我们写第一个程序的时候,说写有点牵强,其实就是创建了一个新的Android项目,什么代码都没敲,直接就可以运行了。
我们的第一个项目是Hello World,起初我认为这是一个非常简单的程序,不需要多花时间去看,但今天陈老师把昨天和今天我们所学的东西简单的串了一遍,发现有好多东西我都没懂,并且有些东西是老师上课的时候所没提到过的,俗话说“师傅领进门,修行在个人。”对于这句话,我从来没做到过,努力改正吧。下面我把我对这个小程序的理解简单的说一下。
HelloWorld项目创建后,点开,目录层次结构如下图:
如图所示,在Src文件夹下放的是HelloWorldActivity.java源文件,android 2.1/ 存放Android 自身的jar 包。
gen/ 该目录不用我们开发人员维护,但又非常重要的目录。该目录用来存放由Android 开发工具所生成的目录。该目录下的所有文件都不是我们创建的,而是由ADT 自动生成的。该目录下的R.java 文件非常重要,后面会详细的介绍。
assets/ 该目录用来存放应用中用到的类似于视频文件、MP3 一些媒体文件。
res/ res 是resource 的缩写。我们称该目录为资源目录。该目录可以存放一些图标、界面文件、应用中用到的文字信息。
AndroidManifest.xml 该文件是功能清单文件,该文件列出了应用中所使用的所有组件,如“activity”,以及后面要学习的广播接收者、服务等组件。
project.properties 该文件一般也不需要手工去更改。该文件存放了项目对应的一些
环境配置,如应用要求运行的最低Android 版本。
资源被编译到最终的APK 文件里。Android 创建了一个被称为R 的类,这样你在Java
代码中可以通过它关联到对应的资源文件。R 类包含的子类的命名由资源在res/目录下的文
件夹名称所决定。
res/目录下有三个dawable 文件夹——【drawable-*dpi】,区别只是将图标按分辨率高低来放入不同的目录,【drawable-hdpi】用来存放高分辨率的图标,【drawable-mdpi】用来存放中等分辨率的图标,【drawable-ldpi】用来存放低分辨率的图标。程序运行时可以根据手机分辨率的高低选取相应目录下的图标。不过,如果不想准备过多图片,那么也可以只准备一张图标将其放入三个目录的任何一个中去。
在res/values下有String.xml文件,用来定义字符串和数值,在Activity 中使用getResources().getString(resourceId)或getResources().getText(resourceId)取得资源。
HelloWorld项目中String.xml中代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, HelloWorldActivity!</string>
<string name="app_name">HelloWorld</string>
<string name="btn"></string>
</resources>
每个string 标签声明了一个字符串,name 属性指定其引用名。
把应用中出现的文字单独存放在strings.xml 文中的原因有两个,一是为了国际化,二是为了减少应用的体积,降低数据冗余。
Res/layout下为布局文件Main.xml,是ADT 默认自动创建的。与在网页中布局中使用HTML 文件一样,Android 在XML 文件中使用XML 元素来设定屏幕布局。每个文件包含整个屏幕或部分屏幕,被编译进一个视图资源,可以被传递给Activity.setContentView 或被其他布局文件引用。文件保存在工程的res/layout/ 目录下,它被Android 资源编辑器编译。
HelloWorld项目中main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
<LinearLayout>元素
“LinearLayout”翻译成中文是“线性布局”,所谓线性布局就是在该元素下的所有子元素会根据其“orientation”属性的值来决定是按行或者是按列逐个显示。
<TextView>元素
该元素与HTML中的<label>元素比较相似。也是一种显示控件。
其属性text指定在该元素上面显示的文字内容。建议将该文字内容在strings.xml文件中进行定义,之后再在main.xml文件中通过“@string/stringName”的方式进行引用。
Gen下的R.java文件中默认有attr、drawable、layout、string 等四个静态内部类,每个静态内部类分别对应一种资源,如layout 静态内部类对应layout 中的界面文件,其中每个静态内部类中的静态常量分别定义一条资源标识符, 如“ public static final int main=0x7f030000;”对应的是layout 目录下的main.xml 文件。具体的对应关系,如下图:
现在已经理解了R.java 文件中内容的来源,也即是当开发者在res/目录中任何一个子
目录中添加相应类型的文件之后,ADT 会在R.java 文件中相应的匿名内部类当中自动生成
一条静态int 类型的常量,对添加的文件进行索引。如果在layout 目录下在添加一个新的
界面,那么在public static final class layout 中也会添加相应的静态int 常量。相反
的,当我们再res 目录下删除任何一个文件,其在R.java 中对应的记录会被ADT 自动删除。
再比如说我们在【strings.xml】添加一条记录,在R.java 的string 内部类中也会自动增
加一条记录。
R.java 文件会给我们开发程序带来很大的方便,比如在程序中我们使用“public static final int icon=0x7f020000;”就可以找到其对应的icon.png 这幅图片。
R.java 文件除了有自动标识资源的“索引”功能之外,还有另一个主要的功能,当res
目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源
编译到该应用的APK 包中,这样可以节省Android 手机的资源。
在xml 文件中, 如main.xml 以及AndroidMainfest.xml 文件中通过“@drawable/icon”的方式获取。其中“@”代表的是R.java 类,“drawable”代表R.java中的静态内部类“drawable”,“/icon”代表静态内部类“drawable”中的静态属性“icon”。而该属性可以指向res 目录下的“drawable-*dpi”中的icon.png 图标。其他类型的文件也比较类似。
如果访问的是Android 系统中带的文件,则要添上包名“android:”。
在布局文件当中我们需要为一些组件添加Id 属性作为标示,可以使用如下的表达式“@+id/string_name”其中“+”表示在R.java 的名为id 的内部类中添加一条记录。如"@+id/button"的含义是在R.java 文件中的id 这个静态内部类添加一条常量名为button,该常量就是该资源的标识符。如果id 这个静态内部类不存在,则会先生成它。通过该方式生成的资源标识符,仍然可以以“@id/string_name”的方式引用。
AndroidManifest.xml
每个应用程序都有一个功能清单文件AndroidManifest.xml)在它的
根目录里。这个清单文件给Android 系统提供了关于这个应用程序的基本信息,系统在运行
任何程序代码之前必须知道这些信息。
AndroidManifest.xml 主要包含以下功能:
• 命名应用程序的Java 应用包,这个包名用来唯一标识应用程序;
• 描述应用程序的组件——活动、服务、广播接收者、内容提供者;对实现每个组件
和公布其功能(比如,能处理哪些意图消息)的类进行命名。这些声明使得Android
系统了解这些组件以及它们在什么条件下可以被启动;
• 决定应用程序组件运行在哪个进程里面;
• 声明应用程序所必须具备的权限,用以访问受保护的部分API,以及和其它应用程
序交互;
• 声明应用程序其他的必备权限,用以组件之间的交互;
• 列举测试设备Instrumentation 类,用来提供应用程序运行时所需的环境配置及其
他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除;
• 声明应用程序所要求的Android API 的最低版本级别;
• 列举application 所需要链接的库;
以下是AndroidManifest.xml中的代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.class3g.activity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".HelloWorldActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<manifest>元素
该元素是AndroidManifest.xml 文件的根元素,该元素为必选。其中根据xml 文件的语
法,“ xmlns:android ” 指定该文件的命名空间。功能清单文件会使用“
http://schemas.android.com/apk/res/android”所指向的一个文件。“package”属性是指
定Android 应用所在的包,以后会经常说到“应用的包”,“应用的包”就是指该属性的内容。
“android:versionCode”指定应用的版本号。如果应用需要不断升级,在升级的时候应该修改该值。“android:versionName”是版本名称,名称的取定可根据爱好而定。
<application>元素
<application>是非常重要的一个元素,今后我们开发的许多组件都会在该元素下定义
的。该元素为必选元素。<application>的“icon”属性是用来设定应用的图标。
<application>的“label”属性用来设定应用的名称。指定其属性值所用的表达式
“@string/app_name”含义与上面的表达式“@drawable/icon”一样,同样是指向R.java
文件中的string 静态内部类中的app_name 属性所指向的资源。在这里它指向的是
“strings.xml”文件中的一条记录“app_name”,其值为“HelloWorld”,因此,这种
表达方式等价于android:label="HelloWorld"。
<activity>元素
<activity>元素的作用是注册一个Activity 信息,当我们在创建“HelloWorld”这个项
目时,指定了【Create Activity】属性为“HelloActivity”,之后ADT 在生成项目时帮我
们自动创建了一个Activity 名称就是“HelloActivity.java”,Activity 在Android 中属
于组件,它需要在功能清单文件中进行配置。
<activity>元素的“name”属性指定的是该Activity 的类名。我们可以看到这个属性值
“.HelloActivity”中的“.”, “.”代表的是在上面<manifest>元素的“package”属性
中指定的当前包。因而“.HelloActivity”的含义等价于“com.sharpandroid.activity.HelloActivity.java”。Activity 只能放在“应用的包”或者其子包里面,而不能在“应用的包”以外的包中。
<intent-filter>元素
翻译成中文是“意图过滤器”。首先简单介绍什么是意图(Intent)。应用程序的核心组
件(活动、服务和广播接收器)通过意图被激活,意图代表的是你要做的一件事情,代表你
的目的,Android 寻找一个合适的组件来响应这个意图,如果需要会启动这个组件一个新的
实例,并传递给这个意图对象。
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
是最常见的。它表明这个activity 将在应用程序加载器中显示,就是用户在设备上看到的
可供加载的应用程序列表。换句话说,这个activity 是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个activity。