首页 用Eclipse开发和调试Android应用程序

用Eclipse开发和调试Android应用程序

举报
开通vip

用Eclipse开发和调试Android应用程序 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 前面介绍了Windows环境下,基于Android SDK(2.3) 和 Eclipse(helios)的 Android开发环境的搭建,并创建了第一个应用程序Hello Android World。具体挺参 考小生的blog:http://blog.sina.com.cn/deaboway 或者http://blo...

用Eclipse开发和调试Android应用程序
no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 前面介绍了Windows环境下,基于Android SDK(2.3) 和 Eclipse(helios)的 Android开发环境的搭建,并创建了第一个应用程序Hello Android World。具体挺参 考小生的blog:http://blog.sina.com.cn/deaboway 或者http://blog.csdn.net/deaboway。 现在,我们已经可以使用 Eclipse 来创建和开发 Android 应用程序,本文将仍 以 Hello Android World 工程来深入解析 Eclipse 中 Android 工程的结构以及调试。 写上篇的时候,刚好 Android SDK Platform Honeycomb Preview, revision 1 (android-3.0_pre_r01-linux.zip)已经加入 http://dl- ssl.google.com/android/repository/repository.xml,却无法下载,因此我们的第一个 Android 应用程序是用的 Android SDK Platform 2.3.1,即 Android 9 AVD 进行演 示。现在 Android SDK Platform Honeycomb Preview 已经放到 http://dl- ssl.google.com/android/repository/android-3.0_pre_r01-linux.zip,敢为天下先是我等 求知若渴的程序员的优秀品质,因此,本次我们使用最新版本的 Android SDK Platform Honeycomb Preview 来进行我们本次教程。 先看看最新的 Honeycomb Preview 的样子吧(由于是 Preview 版本,启动确实 不敢恭维,根据传闻,前几天之所以该版本一度无法下载安装是因为 google 发现 这个 Preview 版本太烂,面子上挂不住,所以又撤掉了,呵呵): 相比手机上目前使用的最高 Android 2.3 版本而言,Android 3.0 Honeycomb 更 适合平板电脑使用,是专门为 Android 平板电脑进行优化的系统版本。随着 SDK 的发布,更加有利于开发者和厂商针对 Android 3.0 Honeycomb 平板电脑进行开 发,包括 Android 平板电脑应用和匹配。 1 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 一、 Android 应用程序概述 1. Android 的嫡系组件 Android 有四项一等公民(或称为嫡系组件),包括:Activity(活动)、 ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与 Service (服务)。它们都必须宣告于 AndroidManifest.xml 档案里。 Activity 活动 活动是最常用的 Android 应用程序形式。活动在一个称为视图(后文将介 绍)的类的帮助下,为应用程序提供 UI。视图类实现各种 UI 元素,比如文本框、 标签、按钮和计算平台上常见的其他 UI 元素。 一个应用程序可以包含一个或多个活动。这些活动通常与应用程序中的屏幕 形成一对一关系。 应用程序通过调用 startActivity() 或 startSubActivity() 方法从一个活动转移到 另一个活动。如果应用程序只需“切换”到新的活动,就应该使用前一个方法。如 果需要异步的调用/响应模式,就使用后一个方法。在这两种情况下,都需要通过 方法的参数传递一个 intent。 由操作系统负责决定哪个活动最适合满足指定的 intent(后文将介绍)。 对于 Activity,关键是其生命周期的把握(后文将介绍),其次就是状态的保 存和恢复(onSaveInstanceState onRestoreInstanceState),以及 Activity 之间的跳转 和数据传输(intent)。 Activity 几乎承接着用户对应用程序(Application)的所有操作,Activity 应该 有一个窗口(Window),这个窗口是可以通过不用的主题(Theme)改变样子 的。Activity 应该要注意它的生命周期(Lifecycle)、设备状态(Configuration)改 变时的影响以及运行状态和数据的保存,这个在一个应用程序是否可靠和人性化上 至关重要。Activity 里还应该要申明一些许可(Permissions),以便使用 Android 的一些软硬件功能,这些申明可以由代码或者 Manifest.xml 给出。最后,每个 Activity(的入口)一定要在 Manifest 当中申明。 Service 服务 与其他多任务计算环境一样,“在后台”运行着一些应用程序,它们执行各 种任务。Android 把这种应用程序称为“Service 服务”。 Service 是没有界面的程序,它是所谓的服务,也叫后台程序。应该要非常注 意 Service 的启动(startService)和绑定(bindService)这两种开启 Service 的方法 之间的关系以及 Service 对应的生命周期,两种开户 Service 的方法对 Service 的生 命周期效果是不同的。还有就是申明许可以及申明 Service,也是在代码内或者 Manifest 内申明。 BroadcastReceiver 广播接收器 2 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 广播接收器是一个应用程序组件,它接收请求并处理 intent。与服务一样,接 收器在一般情况下也没有 UI 元素。广播接收器通常在 AndroidManifest.xml 文件中 注册。广播接收器的类属性是负责实现这个接收器的 Java 类。 广播接收并不是通常所说的无线电广播,而是指由 sendBroadcast()所发送出来 的意图(Intent),即广播在这里的意思是意图,BroadcastReceiver 在注册 (Registe)之后可以自动监听符合预先给定的条件的意图,如果有则会通知此 BroadcastReceiver 的持有程序。 ContentProvider 内容提供程序——数据管理 内容提供程序是 Android 的数据存储抽象机制。我们以移动设备上常见的一 种数据为例:地址簿或联系人数据库。地址簿包含所有联系人及其电话号码,用户 在使用手机时可能需要使用这些数据。内容提供程序对数据存储的访问方法进行抽 象。内容提供程序在许多方面起到数据库服务器的作用。对数据存储中数据的读写 操作应该通过适当的内容提供程序传递,而不是直接访问文件或数据库。可能还有 内容提供程序 的 “客户机” 和 “实现”。 ContentProvider 是作保存应用程序数据和建立维持数据库之用,以便程序重 新启动时回到以前的状态或者保存信息。应该注意应用程序的使用权限以及 SQL 语言的使用,Android 用的是一个轻量级的数据库系统 SQLite。 2. Android 生命周期 Android 程序的生命周期是由系统控制而非程序自身直接控制,这与桌面应用 程序在程序自身收到关闭请求后执行一个特定的动作(比如从 main 函数中 return)而导致进程结束的思维不同。 在 Android 系统中,当某个 activity 调用 startActivity(myIntent)时,系统会在 所有已经安装的程序中寻找其 intentfilter 和 myIntent 最匹配的一个 activity,启动这 个进程,并把这个 intent 通知给这个 activity。这就是一个程序的“生”。在 Android 中,所有的应用程序“生来就是平等的”,所以不光 Android 的核心程序 甚至第三方程序也可以发出一个 intent 来启动另外一个程序中的一个 activity。 Android 的这种设计非常有利于“程序部件”的重用。 Android 根据其重要性在内存不足的时候移去重要性最低的进程。重要性由高 到低为: 1.前台进程。这样的进程拥有一个在屏幕上显示并和用户交互的 activity 或者 它的一个 IntentReciver 正在运行。这样的程序重要性最高,只有在系统内存非常 低,万不得已时才会被结束。 2.可见进程。在屏幕上显示,但是不在前台的程序。比如一个前台进程以对话 框的形式显示在该进程前面。这样的进程也很重要,它们只有在系统没有足够内存 运行所有前台进程时,才会被结束。 3.服务进程。这样的进程在后台持续运行,比如后台音乐播放、后台数据上传 下载等。这样的进程对用户来说一般很有用,所以只有当系统没有足够内存来维持 所有的前台和可见进程时,才会被结束。 3 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 4.后台进程。这样的程序拥有一个用户不可见的 activity。这样的程序在系统 内存不足时,按照 LRU 的顺序被结束。 5.空进程。这样的进程不包含任何活动的程序部件。系统可能随时关闭这类进 程。 从某种意义上讲,垃圾收集机制把程序员从“内存管理噩梦”中解放出来, 而 Android 的进程生命周期管理机制把用户从“任务管理噩梦”中解放出来。 Android 使用 Java 作为应用程序 API,并且结合其独特的生命周期管理机制同时为 开发者和使用者提供最大程度的便利。 Activity生命周期 Activity 中常用的函数有 SetContentView() findViewById() finish() startActivity(),其生命周期涉及的函数有: void onCreate(Bundle savedInstanceState) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy() 4 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 注意的是,Activity 的使用需要在 Manifest 文件中添加相应的,并 设置其属性和 intent-filter。 Service 生命周期 Service 可以通过 Context.startService()或 Context.bindService()创建,通过 Context.stopService()、Service.stopSelf()、Service.stopSelfResult()或 Context.unbindService()来关闭。其生命周期涉及的函数有: void onCreate() 5 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway void onStart(Intent intent) void onDestroy() 其中 onCreate()和 onDestroy()可以被所有服务调用,无论是由 Context.startService()还是 Context.bindService()发起的 Service。但是,onStart()只能 被由 startService()发起的 Service 调用。 如果一个 Service 运行其它对象绑定它,需要扩展如下 callback 方法: IBinder onBind(Intent intent) boolean onUnbind(Intent intent) void onRebind(Intent intent) BroadcastReceiver 生命周期 只包含一个方法:void onReceive(Context curContext, Intent broadcastMsg) 包含活动的组件的 BroadcastReceiver 将不会被系统关闭,但是仅包含不活动 的组件的进程将随时会背系统关闭(当其它组建需要内存时)。 6 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 3. Intent 简介——Android 的创新导航与触发机制 前文介绍了 Android 的四项一等公民:Activity(活动)、ContentProvider(内 容提供程序)、BroadcastReceiver(广播接收器)与 Service(服务)。这四种组件 是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的 Android 应 用。 在这些组件之间的通讯中,主要是由 Intent 协助完成的。Intent 是 Android 应 用开发里很重要的一个元件,通过 Intent 可以从一个 Activity 来启动另一个任意的 Activity,不管是自己定义的还是系统定义的。在 ActivityGroup(extends Activity) 里面,Intent 的 flag 设置对于子 Activity 的启动方式至关重要。 Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述, Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组 件,并完成组件的调用。 因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关 信息,实现调用者与被调用者之间的解耦。 Android 应用程序框架的强大之处在于它将 Web 习惯引入到移动应用程序 中。这并不意味着该平台提供了一个强大的浏览器,也不仅限于使用 JavaScript 和 服务器端资源,而是涉及 Android 平台的工作原理以及该平台的用户如何与移动设 备交互这一核心问题。互联网的强大之处一言以蔽之,在于一切事物通过一次单击 即可获得。这些单击的内容对于用户来说就是 URL(UniformResource Locator,统 一资源定位符)或 URI(Uniform Resource Identifier,统一资源标识符)。有效使 用 URI 可帮助用户方便快捷地访问所需的日常信息。“把链接发给我”就说明了 一切。 在移动设备上复制桌面设备体验的平台只能吸引一小部分忠实的用户。多级 菜单、多次单击在移动市场中通常都不被人所接受。移动应用程序对直观易用的要 求比其他任何市场中的应用程序都要高。Intent 和 IntentFilter 将“单击”范例引入到 了 Android 平台移动应用程序使用和开发的核心中。 Intent 结构 Intent 是执行某操作的一个抽象描述,它描述了如下内容: 首先,要执行的动作(action)的一个简要描述,如 VIEW_ACTION(查 看)、EDIT_ACTION(修改)等,Android 为我们定义了一套 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 动作: MAIN_ACTION VIEW_ACTION EDIT_ACTION PICK_ACTION GET_CONTENT_ACTION DIAL_ACTION CALL_ACTION SENDTO_ACTION 7 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway ANSWER_ACTION INSERT_ACTION DELETE_ACTION RUN_ACTION LOGIN_ACTION CLEAR_CREDENTIALS_ACTION SYNC_ACTION PICK_ACTIVITY_ACTION WEB_SEARCH_ACTION 此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的 Activity 来处理我们的自定义动作。 其次,执行动作要操作的数据(data),Android 中采用指向数据的一个 URI 来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示,如在联系人应用中,一个指向某联系人的 URI 可能为: content://contacts/1。这种 URI 表示,通过 ContentURI 这个类来描述,具体可以参 考 android.net.ContentURI 类的文档。 此外,除了 action 和 data 这两个重要属性外,还有一些附加属性: category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示 Intent 的接受者应该在 Launcher 中作为顶级应用出现;而 ALTERNATIVE_CATEGORY 表示当前的 Intent 是一系列的可选动作中的一个,这 些动作可以在同一块数据上执行。 type(数据类型),显式指定 Intent 的数据类型(MIME)。一般 Intent 的数 据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指 定的类型而不再进行推导。 component(组件),指定 Intent 的的目标组件的类名称。通常 Android 会根 据 Intent 中包含的其它属性的信息,比如 action、data/type、category 进行查找,最 终找到一个与之匹配的目标组件。但是,如果 component 这个属性有指定的话,将 直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。 extras(附加信息),是其它所有附加信息的集合。使用 extras 可以为组件提 供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标 题、正文等保存在 extras 里,传给电子邮件发送组件。 总之,action、 data/type、category 和 extras 一起形成了一种语言。这种语言 使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加 入到系统中,它们可以添加新的 action、 data/type、category 来扩展这种语言。应 用也可以提供自己的 Activity 来处理已经存在的这样的“短语”,从而改变这些 “短语”的行为。 解析 Intent 在应用中,我们可以以两种形式来使用 Intent: 8 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway • 显式(直接)Intent:指定了 component 属性的 Intent(调用 setComponent(ComponentName)或者 setClass(Context,Class)来指定)。 通过指定具体的组件类,通知应用启动对应的组件。 • 隐式(间接)Intent:没有指定 comonent 属性的 Intent。这些 Intent 需 要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组 件中,确定满足此 Intent 的组件。 对于显式(直接)Intent,Android 不需要去做解析,因为目标组件已经很明 确,Android 需要解析的是那些隐式(间接)Intent,通过解析,将 Intent 映射给可 以处理此 Intent 的 Activity、BroadcastReceiver 或 Service。 Intent 解析机制主要是通过查找已注册在 AndroidManifest.xml 中的所有 IntentFilter 及其中定义的 Intent,最终找到匹配的 Intent。在这个解析过程中, Android 是通过 Intent 的 action、type、category 这三个属性来进行判断的,判断方 法如下: • 如果 Intent 指明定了 action,则目标组件的 IntentFilter 的 action 列表中 就必须包含有这个 action,否则不能匹配; • 如果 Intent 没有提供 type,系统将从 data 中得到数据类型。和 action 一样,目标组件的数据类型列表中必须包含 Intent 的数据类型,否则 不能匹配。 • 如果 Intent 中的数据不是 content:类型的 URI,而且 Intent 也没有明确 指定它的 type,将根据 Intent 中数据的 scheme(比如 http:或者 mailto:)进行匹配。同上,Intent 的 scheme 必须出现在目标组件的 scheme 列表中。 • 如果 Intent 指定了一个或多个 category,这些类别必须全部出现在组建 的类别列表中。比如 Intent 中包含了两个类别: LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到 的目标组件必须至少包含这两个类别。 Intent 和 IntentFilter Intent 是对需要的声明。 IntentFilter 是在需要时有能力和有兴趣提供协助的声明。 Intent 由一系列描述所需动作或服务的信息构成。本节将介绍所请求的动作以 及与之相关的数据。 IntentFilter 可以是通用的,也可以特定于向某些 Intent 提供服务。 Intent 的动作属性通常为动词,例如 VIEW、PICK 或 EDIT。很多内置的 Intent 动作都是作为 Intent 类的成员定义的。应用程序开发人员也可以创建新动 作。要查看信息,应用程序可以采用以下 Intent 动作:Intent 的数据部分采用 URI 9 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 的形式表示,并且可以是信息的任何部分,例如联系人记录、网站位置或对媒体剪 辑的引用。 IntentFilter 定义 Intent 与应用程序之间的关系。IntentFilter 可以与 Intent 的数 据部分或动作部分相关,或同时与两者相关。IntentFilter 还包含一个 category(类 别)字段。类别可以帮助对动作进行分类。例如,CATEGORY_LAUNCHER 类别 指示 Android 包含此 Intent-Filter 的 Activity 在主应用程序启动器或主界面上应该处 于可见状态。 分发 Intent 后,系统会计算可用的 Activity、Service,以及已注册的 BroadcastReceiver,并将 Intent 分发给大多数适当的接收者。 IntentFilter 通常在应用程序的 AndroidManifest.xml 中使用标记进 行定义。从本质上说,AndroidManifest.xml 文件就是一个应用程序描述符文件。 下一节介绍,这是 Android 在移动设备屏幕上显示 UI 元素的机制。 4. Android 视图——显示用户界面(UI)元素 Android 活动通过视图显示 UI 元素。视图采用以下布局设计之一: • LinearVertical - 后续的每个元素都排在前一个元素下面,形成一个单 一列。 • LinearHorizontal - 后续的每个元素都排在前一个元素右边,形成一个 单一行。 • Relative - 后续的每个元素相对于前一个元素有一定的偏移量。 10 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway • Table - 与 HTML 表相似的一系列行和列。每个单元格可以包含一个 视图元素。 选择一种布局(或布局的组合)之后,就可以用各个视图显示 UI。 视图元素由大家熟悉的 UI 元素组成,包括: • Button • ImageButton • EditText • TextView(与标签相似) • CheckBox • Radio Button • Gallery 和 ImageSwitcher(用来显示多个图像) • List • Grid • DatePicker • TimePicker • Spinner(与组合框相似) • AutoComplete(具有文本自动补全特性的 EditText) 视图是在一个 XML 文件中定义的。每个元素都有一个或多个属于 Android 名 称空间的属性。 二、 创建 Android Eclipse 工程 请参考小生的《Android SDK 2.3 与 Eclipse 最新版开发环境搭建(五)》,博 文地址:http://blog.sina.com.cn/s/blog_573860a90100ownd.html or http://blog.csdn.net/deaboway/archive/2011/01/30/6170449.aspx 三、 工程结构详细解析 1. 工程结构 在 Eclipse 的 Java 透视图中,可以看到工程的 Package Explorer 如下图: 11 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 具体包括: src 文件夹 - 包含示例应用程序的包,即 org.deaboway.test。 R.java - Android Developer Tools 自动创建这个文件,它提供访问 Android 应 用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。 HelloAndroidWorld.java - 应用程序的主活动类的实现。 Referenced libraries - 包含 android.jar,这是 Android SDK 中的 Android 运行 时类的 jar 文件。 res 文件夹- 包含应用程序的资源,包括: • drawable - 图标:这个文件夹包含图形文件,比如图标和位图。 • layout - 布局文件:这个文件夹包含表示应用程序布局和视图的 XML 文件。 12 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway • values - 字符串:这个文件夹包含 strings.xml 文件。这是为应用程 序实现字符串本地化的主要方法。 AndriodManifest.xml - 示例应用程序的部署描述符。 default.properties 和 proguard.cfg – 从 2.3 版本以后,android sdk 本身包含 proguard,可以通过正常的编译方式也能实现代码混淆,我们可以看到 android-sdk- windows\tools\下面多了一个 proguard 文件夹。防止反编译工具进行反编译,保证 代码安全。 2. 主类分析 这个示例应用程序由一个 Activity(活动)组成,即 HelloAndroidWorld。正 如前面提到的,HelloAndroidWorld 类是在 HelloAndroidWorld.java 文件中实现 的。 package org.deaboway.test; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroidWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // TextView textView = new TextView(this); // textView.setText("Hello Android World!"); // setContentView(textView); setContentView(R.layout.main); } } 在这个源代码片段中,要注意几点: • HelloAndroidWorld 是一个普通的 Java 类,包含包和导入语句。 • HelloAndroidWorld 扩展 android.app 包中的 Android 基类 Activity。 • onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。 Bundle 类本质上是 map 或 hashmap 的包装器。在这个参数中传递构造活动 所需的元素。这里暂时不讨论这个参数。 • setContentView() 负责用 R.layout.main 参数创建主 UI。R.layout.main 是应用 程序资源中主布局的标识符。 3. R.java 文件 R.java 文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都 会丢失。本实例的 R.java 文件内容如下: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ 13 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway package org.deaboway.test; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } } R 类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注 意,这些类都是静态的。 请注意 R.layout.main 代表的元素。这个标识符代表由 main.xml 定义的布局。 在活动的 onCreate 方法中可以使用这个值:setContentView(R.layout.main)。这就是 在运行时把特定的活动(这里是 HelloAndroidWorld)和特定的布局(主布局)联 系在一起的方法。 4. main.xml 文件 本示例应用程序包含一个活动和一个视图。应用程序包含一个名为 main.xml 的文件,它代表活动的主 UI 的视觉方面。 注意,在 main.xml 中没有指定在哪里使用这个布局。这意味着,如果需要的 话,可以在多个活动中使用它。 这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成 一列。这里有一个 TextView 元素,它与其他开发环境中的标签类似。TextView 代 表不可编辑的静态文本。 注意,每个视图元素(比如这个示例中的 LinearLayout 和 TextView)都有属 于 Android 名称空间的属性。一些属性是所有视图元素都有的,比如 android:layout_width 和 android:layout_height。这些属性可以采用的值是: fill_parent - 使视图元素占满可用的空间。也可以认为这就是 “拉伸”。 14 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway wrap_content - 这个值让 Android 把元素一个接一个地排列,不进行拉伸。 5. AndroidManifest.xml 文件 AndroidManifest.xml 文件是 Android 应用程序的部署描述符。这个文件列出 应用程序中包含的所有 Activity(活动)、ContentProvider(内容提供程序)、 BroadcastReceiver(广播接收器)与 Service(服务),以及应用程序支持的 IntentFilter。下面是这个示例应用程序的完整的 AndroidManifest.xml 文件。 • 这里指定了源文件中的包名。采用与 Java 源文件和导入语句相似的模式。 标记的实际作用是 “导入” 这个包中的类。在这个文件中,所 有非完全限定的类都属于 package 属性指定的包。 • 标记的一个属性引用了应用程序的一个资源。请注意 drawable 标识符前面的 @ 符号。这里的意思是,在应用程序资源的 drawable 文件夹 中寻找名为 “icon” 的资源。 • 标记包含以下属性和值: o android:name 表示实现这个活动的 Java 类。 o android:label 是应用程序的名称。注意,它来自一个字符串资源。 string.xml 文件包含应用程序的本地化字符串。 o 表示应用程序中可用的 IntentFilter。这是 Android 应用 程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主” 操作(也就是入口点),而且它位于 OS 的启动器中。这意 味着可以在 Android 设备上像启动其他应用程序一样,从应用程序主 列表中启动它。 四、 应用程序调试 要想检查正在运行的应用程序中发生了什么情况,就需要查看正在运行的 Dalvik VM。在 Eclipse 中,选择 Window > Open Perspective > Other。在出现的对 15 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 话框中选择 DDMS。这会在 Eclipse 中打开一个新的透视图,其中有许多有趣的窗 口。 DDMS 为 IDE 和 Emultor(or GPhone)架起来了一座桥梁。Developer 可以通过 DDMS 看到目标机器上运行的进程/线程状态:可以让 Eclipse 程序连接到开发机上 运行;可以看进程的 heap 信息、logcat 信息、进程分配内存情况;可以像目标机发 送短信、发送地理位置信息以及打电话;可以像 gdb 一样 attach 某一个进程调试。 下面简要介绍一下 DDMS 透视图中提供的资源: 1. Devices Device 中罗列了 Emulator 中所有的进程,选项卡右上角那一排按钮分别为: Debug the selected process 调试进程、Update Heap 更新进程堆栈信息、Dump HPROF file 检查 HPROF(Heap/CPU Profiling Tool)文件、Cause GC 调用垃圾回 收、更新进程 Update Threads、Start Method Profiling 开始方法分析、Stop Process 停止某个进程,和 Screen Capture 抓取 Emulator 目前的屏幕。当你选中某个进程, 并按下调试进程按钮时,如果 eclipse 中有这个进程的代码,那就可以进行源代码 级别的调试。有点像 gdb attach。图片抓取按钮可以把当前 android 的显示桌面抓到 你的机器上,也是非常有用。 这里可以查看到所有与 DDMS 连 接的终端的详细信息,以及每个终端正在运 行的 APP 进程,每个进程最右边相对应的是与调试器链接的端口。因为 Android 是基于 Linux 内核开发的操 作平台,同时也保留了 Linux 中特有的进程 ID,它介 于进程名和端口号之间。 DDMS 监听第一个终端 App 进程的端口为 8600,APP 进程将分配 8601,如 果有更多终端或者更多 APP 进程将按照这个顺序依次类推。DDMS 通过 8700 端口 (”base port”)接收所有终端的指令。 2. Emulator Control 16 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 通过这个面板的一些功能可以非常容易的使测试终端模拟真实手机所具备的 一些交互功能,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受 SMS 消息和发送虚拟地址坐标用于测试 GPS 功能等。 Telephony Status: 通过选项模拟语音质量以及信号连接模式。 Telephony Actions: 模拟电话接听和发送 SMS 到测试终端。 Location Control: 模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地 理标识,可以通过以下 3 种方式: • Manual: 手动为终端发送二维经纬坐标。 • GPX: 通过 GPX 文件导入序列动态变化地理坐标,从而模拟行进中 GPS 变化的数值。 17 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway • KML: 通过 KML 文件导入独特的地理标识,并以动态形式根据变化 的地理坐标显示在测试终端。 如:在 Emulator Control\Telephony Actions 中输入如上图内容“Android 中 文”,单击发送后,在 Android 模拟器中打开 Messaging,看到下面的短信: 3. 文件管理器 显示文件系统信息。File Explorer 非常有用:它可以把文件上传到 Android、 或者从 Android 上下载文件下来、也可以进行文件删除操作。选项卡右上角有上 传、下载、删除三个按钮。一般情况下,File Explorer 会有如下三个目录:data、 sdcard、system。 • data 对应手机的 RAM,会存放 Android OS 运行时的 Cache 等临时数 据(/data/dalvik-cache 目录);没有 root 权限时 apk 程序安装在 /data/app 中(只是存放 apk 文件本身);/data/data 中存放 Android 中 所有程序(系统 apk+第三方 apk)的详细目录信息。 • mnt 是 mount,挂装的意思,mnt 目录下的 sdcard 对应 sd 卡。 • system 对应手机的 ROM,OS 以及系统自带 apk 程序等存放在这里。 用户应用程序部署在 /data/app 目录中,而 Android 内置的应用程序部署在 /system/app 目录中。 18 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 4. Threads、Heap、Allocation Tracker Threads 视图列出当前进程的所有线程。 Heap 视图展示一些堆的状态,在垃圾回收其间更新。当选定一个虚拟机时, VM Heap 视图不能显示数据,可以点击右边面包上的带有绿色的”Show heap updates”按钮,然后在点击”Cause GC “实施垃圾回收更新堆的状态。 在 Allocation Tracker 视图里,我们可以跟踪每个选中的虚拟机的内存分配情 况。点击”Start Tracking”后点击”Get Allocations “就可以看到。 例如,为了查看 Garbage Collection 信息:点击 [Start Tracking]按钮 -> 保持程 序运行一段时间后 ->点击[Get Allocations] 按钮,凭借得到的 Allocations 信息可以 通过 Line Number 准确找到哪里的代码出现了问题。 19 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 5. LogCat LogCat 是一个日志文件,它记录 VM 中发生的活动。应用程序可以通过 Log.i(tag,message); 在这个日志文件中添加自己的日志项,其中的 tag 和 message 都 是 Java 字符串。Log 类属于 android.util.Log 包。 6. Console Android 输出的信息,加载程序等信息。 20 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/de
本文档为【用Eclipse开发和调试Android应用程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_233318
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:21
分类:互联网
上传时间:2011-02-15
浏览量:54