• 沒有找到結果。

第 2 章 Android SDK 的开发环境

2.4 Android 中建立工程

2.4.3. 运行工程

在 Android 中运行一个工程,可以使用,右键单击工程名称,“选择 Run As”或者“Debug As”来运行和 调试工程:

图 运行 Android 工程

开始运行的时候,如果现在已经有连接到真实的设备或者仿真器设备上,将直接使用这个设备,否则将启 动一个新的仿真设备。

开始运行后,在 IDE 下层的控制台(console)标签中,将出现目标运行的 log 信息,可以获取目标运行的 信息。出现类似的 Log 信息:

[HelloActivity]Android Launch!

[HelloActivity]adb is running normally.

[HelloActivity]Performing com.example.android.helloactivity.HelloActivity activity launch

[HelloActivity]Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'HVGA' [HelloActivity]WARNING: Application does not specify an API level requirement!

[HelloActivity]Device API version is 4 (Android 1.6)

[HelloActivity]Uploading HelloActivity.apk onto device 'emulator-5554' [HelloActivity]Installing HelloActivity.apk...

[HelloActivity]Success!

[HelloActivity]Starting activity com.example.android.helloactivity.HelloActivity on device

[HelloActivity]ActivityManager: Starting: Intent { cmp=com.example.android.helloactivity/.HelloActivity }

图 运行 HelloActivity 程序

在运行的一个仿真设备的时候,可以进一步通过选择“Run As”中的“Run Configurations”进行进一步的 配置。 启动后的界面如图所示:

图 选择工程中运行的动作

其中,在 Android 的标签中可以选择启动的工程,启动活动(Launch Action)选项中可以选择启动的哪一 个活动(Android 的一个工程中可以包含多个活动)。在 Target 标签中可以选择启动的时候使用的设备。

第二篇 Android应用程序的概述和框架 第 3 章 Android应用层程序的开发方式

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

3.1 应用程序开发的结构 3.2 API 参考文档的使用

3.1 应用程序开发的结构

Android 应用程序开发是 Android 开发中最上面的一个层次,它们构建在 Android 系统提供的 API 之上。

Android 应用程序的基础是 Android 提供的各个 Java 类,这些类组成了 Android 系统级的 API。

Android预置

Android

应用程序

系统API

自开发 应用程序

自开发 应用程序

自开发

应用程序

……

Android手机 Android仿真器

硬件抽象层 硬件抽象层

Android框架层软件

图 Android 应用的开发结构

Android 应用程序可以基于两种环境来开发:Android SDK 和 Android 源代码。Android 系统本身内置了一 部分标准应用(也包括内容提供者),在仿真器(包括 SDK 环境和源代码环境)中已经包含这些内置的程序。

用户自行开发的应用程序和 Android 内置的应用层程序包位于同一个层次,都是基于 Android 框架层的 API 来构建的,它们的区别仅仅在于他们是否被包含在默认的 Android 系统中。

3.2 API参考文档的使用

在开发 Android 应用程序时可以参考 SDK 中提供的参考文档(SDK\docs\index.html),其内容包含在 Reference 标签中。

参考文档分成两种索引方式:

在这些帮助内容中,大部分是 Java 语言的基本语法内容,只有 XML Attributes(XML 属性)一项是 Android 专用的。某些重要的类还包含对于类的详细介绍的图表。

例如,Activity 类的帮助文档的前面的信息如下所示:

public class Activity

extends ContextThemeWrapper

implements ComponentCallbacks KeyEvent.Callback LayoutInflater.Factory View.On CreateContextMenuListener Window.Callback

java.lang.Object

↳ android.content.Context

↳ android.content.ContextWrapper ↳ android.view.ContextThemeWrapper ↳ android.app.Activity

Known Direct Subclasses

ActivityGroup, AliasActivity, ExpandableListActivity, ListActivity

Known Indirect Subclasses

LauncherActivity, PreferenceActivity, TabActivity

从中,可以看出 Activity 类在 android.app 包中,直接继承了 android.view.ContextThemeWrapper,并且被 ActivityGroup, ListActivity 等几个类直接继承。被 LauncherActivity 等几个类间接继承。

类的介绍的主要内容在后面,主要部分是各个类的方法的说明,这些方法也是在类的使用过程中需要主要 关注的内容。

Class Overview (类的介绍)

Summary

某些与 UI 内容相关的类的帮助文档有一些特殊,主要区别是包含了 XML attributes(XML 属性)一类。

XML Attributes(XML 属性),是出现在 AndroidManifest.xml 或者布局文件中(*.xml)的属性。

例如 Button 类的参考文档的主要内容如下所示: Known Direct Subclasses CompoundButton

CompoundButton A button with two states, checked and unchecked.

Known Indirect Subclasses

CheckBox, RadioButton, ToggleButton

XML attributes

See Button Attributes, TextView Attributes, View Attributes Summary

Button 类的头部信息和普通的类基本相同,但是包含了 XML attributes 一个项目,在这里包含了 Button Attributes,TextView Attributes,View Attributes,根据类的继承关系可以得知,这个启示是自己的属性、父类 的属性(Button 类的父类是 android.widget.TextView)、祖父类的属性(Button 类的祖父类是 android.view.View)。

Button 类刚好没有自己的 XML 属性,但是其父类和祖父类有,展开 Inherited XML Attributes 项目的 From class android.widget.TextView 和 From class android.view.View 可以得到这些属性的列表。每个属性包含了 Attribute Name(属性名称) Related Method(相关方法) Description(描述)几个项目。

例如,TextView 的几个属性如下所示:

android:text setText(CharSequence) Text to display.

android:textColor setTextColor(ColorStateList) Text color.

android:text 等表示了属性在 XML 文件中的名称,setText()等表示了在 JAVA 源文件中使用的方法,最右 侧的内容是这个属性的描述。

点击 XML attributes 中的连接可以进入其详细的内容中查看,这些 XML 属性的帮助以及相关的值可以在 android.R.styleable 类中查找,这个类也可以直接被调出,方法为:

Package Index → android → android.R.styleable

android.R.styleable 中列出了一些类的 XML 属性,例如 TextView 的 capitalize 属性的相关内容如下所示:

public static final int TextView_capitalize

If set, specifies that this TextView has a textual input method and should automatically capitalize what the

Must be one of the following constant values.

Constant Value Description

none 0 Don't automatically capitalize anything.

sentences 1 Capitalize the first word of each sentence.

words 2 Capitalize the first letter of every word.

characters 3 Capitalize every character.

This corresponds to the global attribute resource symbol capitalize.

Constant Value: 44 (0x0000002c)

这里列出了属性的值(Value),这些值的本质是整数常量,但是在 XML 中使用的还是名称。整数值是 Android 内部运作使用的。

XML 属性有些是在布局文件中使用的,也有在 AndroidManifest.xml 中使用的,或者在其他的 XML 文件中 使用。

这在 android.R.styleable 的帮助信息中,以 AndroidManifest 为开头的内容是在 AndroidManifest.xml 中使 用的属性。

例如,AndroidManifestAction 项目是 AndroidManifest.xml 中的 Action 标签中使用的内容,如下所示:

public static final int[] AndroidManifestAction

Attributes that can be supplied in an AndroidManifest.xml action tag, a child of the intent-filter tag. See addAction(String) for more information.

Includes the following attributes:

Attribute Summary

android:name The name of an action that is handled, using the Java-style naming convention.

See Also

AndroidManifestAction_name

Attribute Summary 中的 android:name 引用的内容是 AndroidManifest.xml 中的 Action 标签可以使用的 android:name 属性。

相比各种类的帮助信息,接口(Interface)的帮助信息更加简单一些。一般的接口是需要被实现才能够使 用的。

例如,View.OnClickListener 的帮助信息前面的内容如下所示:

public static interface View.OnClickListener

android.view.View.OnClickListener

Known Indirect Subclasses

CharacterPickerDialog, KeyboardView

这里的,android.view.View.OnClickListener 表示了 View.OnClickListener 这个接口在 android.view 这个包中。

对于一个接口,Indirect Subclasses 的含义为实现(

implements

)这个接口。

View.OnClickListener 的帮助信息后面的内容同样列出这个接口中包含的成员方法,如下所示:

第 4 章Android应用程序示例

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

4.1 HelloActivity 程序的运行 4.2 HelloActivity 的源文件结构 4.3 HelloActivity 的编译结构 4.4 SkeletonApp 的程序的运行 4.5 SkeletonApp 源文件结构 4.6 SkeletonApp 编译结构

在软件开发的最初阶段,通常使用一个 Hello World 程序作为最简单的示例,本部分介绍一个 Android 中最 简单应用程序,通过这部分内容可以了解到 Android 程序的文件结构和编译后的结构。

4.1 HelloActivity程序的运行

HelloActivity 是一个简单的 Android 应用程序,其工程文件名称为 HelloActivity,在 Android 的源代码和 SDK 中,都包含了这个包。

HelloActivity 的图标和运行情况如图所示。

图 HelloActivity 的图标和运行情况

这个程序有一个简单的活动(Activity),用于启动一个新的界面,并在界面上显示 “Hello,World!”字 符串。

4.2 HelloActivity的源文件结构

HelloActivity 工程中另有一个 tests 目录,其中也具有自己的 Android.mk 和 AndroidManifest.xml 文件,这 是另一个工程,是 HelloActivity 工程的测试程序。

4.2.1.Android.mk文件

Android.mk 文件是 Android 的工程管理文件,这个文件只在源代码开发的时候使用,在 SDK 的开发中不 需要使用,它包含在工程的根目录中,其内容如下所示:

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

# Only compile source java files in this apk.

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := HelloActivity

LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

# Use the following include to make our test apk.

include $(call all-makefiles-under,$(LOCAL_PATH))

Android.mk 文件是 Android 编译过程中通用的工程管理文件,本地程序、本地库和 Java 程序包都使用 这个文件。这个文件仅仅在基于源代码开发的情况中使用,在 Java 应用程序工程的管理中,该文件不用定义过 多的内容,其中关键的内容是使用 include $(BUILD_PACKAGE)表示从当前目录编译 Java 应用程序包。

LOCAL_PACKAGE_ NAME 定义的是这个程序的 APK 包的名称。LOCAL_MODULE_TAGS 表示这个包的类型。

这个包的 LOCAL_MODULE_TAGS 定义成了 samples,这将编译 APK 包,但是不安装在系统中。使用不 同的值,可以决定是否编译和安装,例如使用 eng,将安装到目标系统中。

最后一行的 include $(call all-makefiles-under,$(LOCAL_PATH)),表示包含本目录的子目录中的 Android.mk 文件,本例中也就是 tests 目录中的内容。

4.2.2.AndroidManifest.xml文件

AndroidManifest.xml 文件是这个 Android 应用程序的工程描述文件,包含了宏观上的内容,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.android.helloactivity">

<application android:label="Hello, Activity!">

<activity android:name="HelloActivity">

<intent-filter> com/example/android/helloactivity 中寻找程序中的 Java 源代码。活动名称将被定义为 HelloActivity,表示活动的 代码是上述源代码目录中的 HelloActivity.java 文件。intent-filter 中的内容指定了程序的启动方式,这里 category 中的 android.intent.category.LAUNCHER 表示活动将在 Android 的桌面(Android 默认的桌面程序名称也是 LAUNCHER)上出现。

这里指定 application 的 android:label 为"Hello,Activity!",这和桌面图标下面的文字以及活动启动后上面的 标题文字是一致的。本例没有指定图标,所以桌面上的图标使用的是默认图标。

在 AndroidManifest.xml 文件中为一个活动指定 label(标签)和 icon(图标)的方法 如下所示:

<activity android:name="HelloActivity"

android:label="@string/label_name"

android:icon="@drawable/icon_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

android:label 指定为字符串、android:icon 指定为图标后,将使用 res/drawable 中对应名称的图片文件作为图 标(本例中将使用 icon_name.png)。

activity 和 application 都具有 android:label 和 android:icon 等属性,由于活动是程序的单元,且应用可以包 含多个活动,因此程序首先将使用 activity 中的这些标签,如果没有则使用上一级的 application 中标签的定义

4.2.3.源代码文件

public class HelloActivity extends Activity { public HelloActivity() { }

@Override

public void onCreate(Bundle savedInstanceState) { // 重载 onCreate()方法 super.onCreate(savedInstanceState);

setContentView(R.layout.hello_activity); // 使用 hello_activity.xml 布局文件 }

}

这 里 的 类 HelloActivity 继 承 实 现 了 Android 系 统 API 提 供 的 活 动 类 ( Activity ) , 使 用 setContentView(R.layout.hello_activity) 指 定 了 当 前 活 动 的 布 局 , 这 里 表 示 将 从 res/layout 目 录 中 找 到 hello_activity.xml 文件作为本例的布局文件使用。

4.2.4.布局文件

hello_activity.xml 是本程序中的布局文件,在 Java 源文件中使用了此文件。本文件在 res/layout 目录中,其 内容如下所示:

<?xml version="1.0" encoding="utf-8"?>

<EditText

xmlns:android="http://schemas.android.com/apk/res/android" ndroid:id="@+id/text"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:textSize="18sp"

<string name="hello_activity_text_text">Hello, World!</string>

</resources>

这里定义了名称为“hello_activity_text_text”的字符串的内容为 Hello,World!,这就是出现在屏幕上的字 符串。

4.3 HelloActivity的编译结构

在 Android 的 SDK 环境开发中,HelloActivity 工程经过编译后,SDK 环境下开发生成的所有目标文件均在 当前工程目录中,包含了 assets、bin、gen 等目录。

在 Android 的 SDK 环境开发中,HelloActivity 工程经过编译后,SDK 环境下开发生成的所有目标文件均在 当前工程目录中,包含了 assets、bin、gen 等目录。