第一个Android应用程序

来源:互联网 发布:淘宝手机助手官网下载 编辑:程序博客网 时间:2024/04/30 14:39

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。