分享

Google Android手机在美亮相

 Taylor 2008-09-24
Google Android手机在美亮相 能否一举成功仍是未知数
2008/09/24 - 手机&网通 - 陈颖芃/综合外电 

据美联社(AP)报导,酝酿已久的Google Android智能型手机终于要在23日于纽约亮相。市调机构Strategy Analytics预估,负责销售的美国行动电信业者T-Mobile在2008年能售出40万支Android手机,为Google取得美国智能型手机市场4%的市占率。

根据T-Mobile发表会邀请函中所述,这款由台湾手机制造商宏达电(HTC)与Google合作开发的手机名为T-mobile G1,将配备大型触控式屏幕、全字母键盘、GPS卫星定位系统、Wi-Fi及3G网络联机功能。根据华尔街日报(WSJ)报导,这款手机将以定价199美元在美销售,主要是考量到苹果(Apple)iPhone先前在美国上市就是以同样的价钱打入市场,Google于是将此价格视为美国智能型手机消费者心中的价格标竿。

据富比士(Forbes)杂志报导,Google对跨足智能型手机界的首款作品寄以极高的期望,除了希望开放原始码的Android操作系统能从此改变手机操作系统趋势之外,Google最终目的其实是预备以手机创造广告收益的另一高峰。众所皆知,Google在网搜界已是广告大亨,单就2007年而言,Google的165亿美元营收几乎都来自在线广告。然而,称霸在线广告市场的Google力求突破,已开始找新的获利管道。打从Google舍弃现有的手机操作系统,决意自行开发Android平台那一刻起,就已开始为日后Android平台套用在线广告技术布局。

据市调机构eMarketer数据显示,美国手机查找广告至2009年营收将达1.8亿美元,而到了2012年,全球营收将高达38亿美元。Google虽洞察先机,但眼前若无法缔造Android手机开卖佳绩,一切梦想将只是空谈。尽管以开放操作系统为号召,部分业界人士对于Android手机挑战苹果iPhone及RIM(Research in Motion)黑莓机(BlackBerry)的实力仍持保留态度。根据市调机构IDC调查显示,目前美国智能型手机市场仍以RIM操作系统为主流。另据市调机构Gartner调查指出,全球市场则由Symbian操作系统领先,初来乍到的Android系统能打下多少市占仍不得而知。

另一方面,苹果强烈的品牌形象及为数可观的死忠爱用者,也凸显Android手机除操作系统外并无独特之处的缺陷。现阶段Google仅能仰赖合作伙伴T-Mobile从营销面下手,寻找攻占美国市场的利器。然而,据彭博信息(Bloomberg)报导,iPhone系列合作对象AT&T在美国已有7,290万用户,远大于T-Mobile的3,150万用户,对Android手机而言仍是不小的威胁。美国市场种种的潜在竞争,在9月23日Android手机盛大上市后,真正的战役才要揭开序幕。



图说:Google Android手机23日在美上市。T-Mobile

 

Android文档阅读01—Android是什么?

许可协议:creativecommons licenses

Android是什么?

Android是一个针对移动设备的程序集, 其中包括一个操作系统, 一个中间件和一些关键性应用. 本文首先概览了Android SDK提供的工具和APIs, 当您在使用Java语言来开发Android平台的应用时您会用到它们.

特性

  • 程序程序框架可重用及可复写组件组成
  • 针对移动设备优化过的Dalvik虚拟机
  • 整合浏览器, 该浏览器基于开源的WebKit引擎开发
  • 提供了优化过得图形系统, 该系统由一个自定义的2D图形库; 一个遵循OpenGL ES 1.0标准(硬件加速)的3D图形库组成
  • 使用SQLite来实现结构化数据的存储
  • 媒体方面对一些通用的audio, video, 和图片格式提供支持(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
  • GSM技术(依赖硬件)
  • 蓝牙, EDGE, 3G和WiFi(依赖硬件)
  • Camera, GPS, 指南针, 和加速计 (依赖硬件)
  • 非常丰富的开发环境, 包括一个设备模拟器, 调适工具, 内存和效率调优工具和一个Eclipse的插件

Android的结构

下图展示了Android 操作系统的主要组件结构. 每一部分都在下面的段落有详细介绍

the major components of the Android operating system

应用程序

Android会附带一些核心的应用程序, 包括一个email客户端, 短信程序, 日历, 地图, 浏览器, 通讯录等等. 所有的应用程序都是由Java语言完成的.

应用程序框架

Developers have full access to the same framework APIs used by the core applications. The application architecture is designed to simplify the reuse of components; any application can publish its capabilities and any other application may then make use of those capabilities (subject to security constraints enforced by the framework). This same mechanism allows components to be replaced by the user.

开发人员可以跟那些核心应用一样, 拥有访问框架APIs的全部权限. 应用的系结构设计简化了各组件之间的重用;任何应用都可以分发自己的组件, 任何应用也可以使用这些分发的组件(应用的使用方法需遵循框架的安全性约束)。这个机制对用户来说同样适用, 他们也可以替换组件.

隐藏在每个应用后面的是一套服务和系统, 其中包括:

 

  • 一套表现丰富,扩展性很强的View, 通过这些View您可以创建包括list, grid, 文本框, 按钮, 甚至一个嵌入浏览器的应用
  • Content Providers, 通过它可以在某个应用内访问其他应用的数据(例如通讯录), 或者共享自己的数据
  • Resource Manager, 提供对静态资源的访问能力, 例如国际化文本和layout文件
  • Notification Manager, 通过该机制, 所有的应用都可以在状态栏显示自己的提醒信息
  • Activity Manager, 用于管理应用的生命周期, 并且提供了通用的向后导航功能


预想了解更多并且对一个应用有一个整体的了解, 请您看编写一个Android应用

Android 包含一套C/C++库, 被用于Android 系统中的各种组件中. 这些功能通过Android 应用框架展现给开发人员. 下面列出一些核心库:

  • System C library - 实现了BSD-derived 的标准C系统库(libc), 用于嵌入式的基于Linux的设备
  • Media Libraries - 基于PacketVideo的 OpenCORE; 该库提供了对许多流行的音频和视频格式的播放回放和录制功能, 同样包括静态图片文件, 包括MPEG4, H.264, MP3, AAC, AMR, JPG, 和 PNG 等
  • Surface Manager - 用于管理不同应用对图形显示子系统和2D和3D图形层的访问
  • LibWebCore - 一个时尚的web浏览器引擎, 为Android浏览器和内嵌的web view提供实现
  • SGL - 隐藏的2D图形引擎
  • 3D libraries - 基于OpenGL ES 1.0 APIs实现的库; 该库用于3D图形加速或提供高优化的3D软件光栅器
  • FreeType - 位图和向量模式的字体绘制
  • SQLite - 一个强大的, 轻量的关系型数据库引擎, 用于所有的应用

Android 运行时

Android包含一组核心库, 提供了Java语言核心库内的大部分功能.


每一个Android应用运行在自己的进程里, 用该应用自己的Dalvik 虚拟机实例. Dalvik 可以让一个设备高效的运行很多个VM. Dalvik 虚拟机执行Dalvik Executable (.dex)格式的文件, 该格式的文件经过优化 占用很小的内存. 该虚拟机是基于存储器的, 运行经过Java语言编译器的类, 这些类通过"dx"工具被转换成.dex格式.


Dalvik 虚拟机依赖Linux kernel 来实现一些潜在功能, 例如线程和底层内存管理.

Linux Kernel

Android基于Linux version 2.6内核来提供系统的核心服务, 例如安全机制, 内存管理, 进程管理, 网络堆栈和驱动模块. 该内核还扮演着一个虚拟的中间层, 该层介于硬件和其余的软件堆栈.

  • 15ce8e18-f4cc-3873-bda4-919bce08fc6c-thumb
  • 描述: Android 操作系统的主要组件结构
  • 大小: 64.7 KB

Android文档阅读02—解析Android程序

许可协议:creativecommons licenses 

 

在Android应用程序中有四个构建块:

  • Activity
  • Intent Receiver
  • Service
  • Content Provider

并不是每个程序都需要所有的四个部分,你的程序可能用到它们其中一些的组合。

一旦你决定在你的程序中需要哪个组件,你应该在一个叫AndroidManifest.xml的文件中列出它们。你在这个XML文件中声明程序中用到的组件和它们的用途和需要。在Android manifest file 文档中查阅完整的细节。

 

 Activity

Activity是Android构造块中最基本的一种,在应用中,一个activity通常就是一个单独的屏幕。每一个activity都被实现为一个独立的类,并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧短消息及进行系统设置的屏幕。每一个这样的屏幕,就是一个activity。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中,一个屏幕甚至会返回值给前一个屏幕。

 

当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。

Intent and Intent Filters

 

Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。Intent类用于描述一个应用想要做什么事。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。

典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。

Android利用一个叫Intent的特殊类来实现屏幕间的切换。一个Intent描述了一个应用程序想要做什么。intent数据结构中两个最重要的部分是动作和动作对应的数据。一个典型动作的值是MAIN(活动的入口),VIEW,PICK,EDIT,和其它一些。数据表示为URI。例如,浏览一个人的联系信息,你应该创建一个带有VIEW活动的intent,并且URI的数据集指向那个人。

 

与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intent filter则用于描述一个activity(或者Intent Receiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。

 

一个屏幕到另一个屏幕之间的导航是通过解析意图(Intent)来实现的。当向前导航时,activity将会调用startActivity (Intent myIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的 Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析 myIntent的动作,这个机制提供了两个关键好处:

  • Activity能够简单的通过在Intent表中发送请求,从其他组件中复用功能
  • Activity能够在任何时候由一个带有相同IntentFilter的Activity替换

 Intent Receiver

当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个Intent Receiver。虽然Intent Receiver在感兴趣的事件发生时,会使用NotificationManager 通知用户,但它并不能生成一个UI。Intent Receiver在AndroidManifest.xml中注册,但也可以在代码中使用 Context.registerReceiver()进行注册。当一个intent receiver被触发时,你的应用不必对请求调用intent receiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的 intent receiver广播给其它应用程序。

 Service

一个Service是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。

Content Provider

应用程序能够将它们的数据保存到文件中、SQL数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,Content Provider将会很有用。一个Content Provider类实现了一组标准的方法,从而能够让其它的应用保存或读取此Content Provider处理的各种数据类型。

更详细的Content Provider资料,可以参考附带文档中的Accessing Content Providers。
 

Android文档阅读03—开发工具

 许可协议:creativecommons licenses

 

Android SDK包含了在Android平台上开发移动应用的各种工具集。它不仅包括了Android模拟器和用于Eclipse的Android开发工具插件(ADT),而且包括了各种用来调试、打包和在模拟器上安装应用的工具。

 Android Emulator

Android模拟器:一个运行在电脑上的手机模拟器。你可以使用这个模拟器,在真实的Android运行环境中去设计、调试和测试自己开发的应用程序。

 Android Development Tools Plugin for the Eclipse IDE

用于Eclipse集成开发环境的Android应用开发工具插件:它为Eclipse集成开发环境增加了强大的功能,使得创建和调试Android应用程序更加简单和快速。如果你使用Eclipse来开发Android应用,ADT插件将给你带来极大的帮助:

  • 可以从Eclipse集成开发环境内部访问别的Android开发工具。例如,ADT允许你直接从Eclipse访问DDMS工具的很多功能,包括截屏、管理端口转发(port-forwarding)、设置断点、查看线程和进程信息。
  • 它提供一个新的项目向导,用于快速创建一个新的Android应用需要的所有基本文件。
  • 它使构建Android应用的过程自动化和简单化。
  • 它提供一个Android代码编辑器,用于为Android的manifest和资源文件编写有效的XML。

更多的关于ADT插件的信息,包括安装指令,请参见Installing the ADT Plugin for EclipseHello Android描述了一个有用的例子程序和程序的效果图。

Dalvik Debug Monitor Service(ddms)

Dalvik调试监视服务:它集成在Dalvik(Android平台的虚拟机)中,用于管理运行在模拟器或设备上的进程,并协助进行调试。你可以用它来杀死进程、选择一个特定程序来调试、生成跟踪数据、查看堆和线程数据、对模拟器或设备进行屏幕快照等等。

Android Debug Bridge (adb)

Android调试桥:它用于向模拟器或设备安装应用程序的.apk文件和从命令行访问模拟器或设备。也可以用于将标准的调试器连接到运行在Android模拟器或设备上的应用代码。

 Android Asset Packaging Tool (aapt)

Android资源打包工具:你可以通过aapt工具来创建.apk文件,这些文件包含了Android应用程序的二进制文件和资源文件。

Android Interface Description Language (aidl)

Android接口描述语言:它用来生成进程间接口代码。例如,在一个服务中可能就会用到。

sqlite3

SQLite3数据库:Android应用程序可以创建和使用SQLite数据文件,而开发者和使用者也可以方便的访问这些SQLite数据文件。

Traceview

跟踪显示工具:它可以生成跟踪日志数据的图形分析视图。这些跟踪日志数据由Android应用程序产生。

mksdcard

创建SD卡工具:它帮助创建磁盘镜像。这个磁盘镜像可以在模拟器上模拟外部存储卡(比如SD卡)。

dx

DX工具:它将.class字节码重写为Android字节码(存储在.dex文件中)。

activityCreator

activityCreator:它是一个脚本,用来生成Ant构建文件。Ant构建文件用来编译Android应用程序。如果你在安装了ADT插件的Eclipse环境下开发,就不需要这个脚本了。
 
 

Android文档阅读04—Application的生命周期

 许可协议:creativecommons licenses

 

在多数情况下, 每个Android应用运行在自己的Linux进程中. 当一个应用的某段code需要运行的时候这个进程将会被创建, 直到不再需要该应用或系统要为其他的应用释放内存的时候才停止.

 

一个非常重要且少有的特性是, 应用进程的存活时间不是由这个应用直接控制的. 而是由系统决定的, 系统会根据每个已知的正在运行的应用情况来定夺, 包括, 该应用对用户的重要性和系统全部可用内存.

 

对于开发人员来讲, 了解每个应用组件(尤其是, Activity, Service, 和IntentReceiver)对于应用进程存活时间的影响是非常重要的. 如果没有正确使用, 可能会导致应用进程在处理重要工作的时候被系统杀掉.

 

在对应用进程生命周期的理解中, 一个典型的错误就是当一个IntentReceiver 接收到Intent 之后, 会在自己的onReceiveIntent()方法中开起一个线程, 而后return这个方法. 一旦这个方法return, 系统会认为这个IntentReceiver 不在处于活跃状态, 也就认为他的宿主进程不再需要(除非还包有其他活跃的应用组件). 以至于当系统需要回收内存的时候会随时释kill掉这个进程, 中止其中的子线程. 解决这个问题的办法是在IntentReceiver中启动一个Service, 这样系统会知道在这个进程中还有活跃的任务需要完成.

 

为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个"重要程度层次". 其重要的程度按以下规则排序:

  1. 前端进程可以是一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),也可以是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程. 在系统中, 只会有少数这样的进程, 并且除非内存已经低到不够这些进程运行, 否则系统不会主动杀掉这些进程. 这时, 设备通常已经达到了需要内存整理的状态, 所以杀掉这些进程是为了不让用户界面停止响应.
  2. 可视进程是持有一个被用户可见, 但没有显示在最前端 (onPause方法被调用时) 的Activity的进程. 举例来说, 这种进程通常出现在一个前端Activity以一个对话框出现并保持前一个Activity可见时. 这种进程被系统认为是极其重要的, 并且通常不会被杀掉, 除非为了保持所有前端进程正常运行不得不杀掉这些可见进程.
  3. 服务进程是持有一个Service的进程, 该Service是由startService()方法启动的, 尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如, 在后台播放mp3或是在后台下载 上传文件), 所以, 除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的.
  4. 后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程. 这些进程不会直接影响用户体验. 加入这些进程已经完整的,正确的完成了自己的生命周期(访问Activity查看更多细节), 系统会在为前三种进程释放内存时随时杀掉这些后台进程. 通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉.
  5. 空进程是没有持有任何活动应用组件的进程. 保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间. 就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源.
当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据. 查看Activity, Service,和IntentReceiver的文档, 了解每个组件在进程整个生命周期中的贡献. 每一个classes的文档详细描述他们在各自应用的生命周期中所起得作用.
 

Android文档阅读05—Hello, Android!及调试

 许可协议:creativecommons licenses

 

第一印象,作为一个开发人员,我们对一个新的开发框架的第一印象通常是看他的”Hello,World!”程序有多简单。在Android中,实现起来是非常简单的。

实现Hello World需要几个步骤:

  • 创建项目
  • 设计用户界面
  • 运行程序:Hello,Android 

以下几节讨论更加详细的内容

  • 通过(XML 布局)XML Layout更新用户界面
  • 调试程序
  • 不使用Eclipse创建项目

Let‘s jump in! 废话少说,马上开始。

创建项目

创建项目非常简单,Eclipse的插件使Adroid的开发变得异常轻松。首先你需要安装一个3.3或以上版本的eclipse(译注:其实3.2也是可以的),然后给Eclipse安装一个Android插件。安装好上面的内容后,我们就可以开始了。

首先,我们来一个总结来看看到底需要几步来完成我们的"Hello, World!"。

1. 通过Eclipse的 File > New > Project 菜单创建"Android Project"项目。

2. 在新Android 项目对话框中添加项目的详细信息

3. 修改自动生成代码模板来显示一些东西

上面3步已经足够了!接下来,让我们开始吧

 

1. 创建Android项目

在Eclipse中选择 File > New > Project 菜单项。如果你已经成功安装了Android 插件,你会在弹出的新项目对话框中看到一个叫做“Android”的条目,包含一个”Android Project”的项目

 

选中"Android Project",点击 Next进行入下一步。

 

2. 填写项目的相关信息

这个窗口里你需要填写一些项目的相关信息.请看图中的示例:

 

下面解释一下屏幕上的内容:

 

这是计算机中保存项目文件目录的名称。

这是和Java语言意义相同的包名(Package namespace)—你的源代码将属于这个包名。同时stub Activity也将据此生成。

你所给出的报名必须保证在你的应用中是唯一的;因为这个原因,包的命名遵循域名方式(domain-style)就显得非常重要了;在实例中我们使用"com.google.android"作为包名;你可以选择一个适合你自己的包名。

 

Android插件将根据这个名称来创建一个stub类。他是一个继承自Activity类的子类。Activity类似一个简单的可以运行和工作的类。它能够根据你的需要创建用户界面,当然了这不是必须的。

 这是你应用程序的标题。

 

你可以通过选择"Use default location"这个复选框来项目文件的存储位置。

 

3.编辑自动生成的程序代码

 

Android插件执行完毕后将创建一个叫做HelloAndroid类,他的内容如下:

Java代码 复制代码
  1. public class HelloAndroid extends Activity {  /**在activity被创建后执行*/    
  2.   
  3.    @Override  
  4.    public void onCreate(Bundle icicle)   
  5.    {   
  6.        super.onCreate(icicle);   
  7.        setContentView(R.layout.main);   
  8.    }   
  9. }   

创建用户界面

创建好项目以后,我们要做的是在屏幕上显示一点文字。下面是完成后的代码,我们将逐行分析它:

Java代码 复制代码
  1. public class HelloAndroid extends Activity {/**在activity被创建后执行*/    
  2.   
  3.    @Override  
  4.    public void onCreate(Bundle icicle) {   
  5.        super.onCreate(icicle);   
  6.        TextView tv = new TextView(this);   
  7.        tv.setText("Hello, Android");   
  8.        setContentView(tv);   
  9.    }   
  10. }   

在Android中,用户界面是由View来组成的。一个View就是一个drawable的对象,比如一个单选按钮,一个动画,或者(本例中)是一个文字标签。View子类型中用来显示文字 类是TextView

下面演示如何构建一个TextView的实例

Java代码 复制代码
  1. TextView tv = new TextView(this);   

 TextView构造函数中的参数类型是Context。Context类可以简单的理解为系统的句柄;他提供访问了诸如资源、数据库以及程序设置的服务。Activity类继承自Context。我们的HelloAndroid类继承自Activity类,他同时也继承了Context。正因为如此我们才能使用’this’这个参数来创建TextView。

 

上面我们已经创建了一个TextView,下面我们来让他显示些文字:

Java代码 复制代码
  1. tv.setText("Hello, Android");   

 这里没有什么好说的。

我们已经创建了一个TextView并且告诉了他要显示什么,最后就是让他显示在屏幕上了,就像下面这样:

Java代码 复制代码
  1. setContentView(tv);   

 setContentView()方法让系统知道哪个View是与Activity的界面有联系的。如果你的Activity没有执行这个方法,界面将什么都不会显示,系统只会显示空屏幕。我们的目的是要显示一些文字,所以我们在这个方法的参数中填上TextView。

 

这就是我们Android中的"Hello, World"了!接下来当然是看看如何运行它了。

运行程序:Hello, Android

Android提供的Eclipse插件使得运行我们的程序非常简单。选择Run > Open Run Dialog菜单;你会看到一个这样的对话框:

 

接下来,选中"Android Application"这一项。点击左上角按钮(文档图标上有个加号的那个)或者简单双击"Android Application"项。你会得到一个叫做"New_configuration" 新launcher。

 

选择一个更好的名字,比如"Hello, Android", 点击"Browse"按钮选择你的项目。(如果你现在打开了多个Android的项目,一定要确认你选择了正确的那个)。Android插件会自动的扫描你的项目来查找Activity 的子类,在"Activity:" 标签下面的下拉框中列出所有的选项。你的"Hello, Android" 只有一个,他将作为缺省的选项。

点击 "Apply" 按钮。示例如下:

 

大功告成!点击run按钮,Androi模拟器将运行。当模拟器启动完成你将看到你的程序。到这里我们就完成了。

 

这就是我们Android中 “Hello,World”。很简单吧,嗯?下面的章节我们会探讨一些比较深入的东西,对你学习Android肯定有所帮助。

通过XML Layout构造用户界面

你刚刚完成"Hello, World"时通过编程来创建用户界面的。也就是说你在你的程序代码中来创建界面。如果你以前做过很多的界面编程,你一定知道有个非常麻烦的事情:在一大段代码中找到并且修改一个小的界面变化是很头疼的。而且也容易忘记属性与视图之间的关系,从而导致错误,浪费大量的时间来调试代码。

 

这就是Android提供了一个替代创建用户界面的模式:基于XML的XML Layout文件。解释这个概念的最好方法就是创建一个例子。这个XML Layout文件实现了我们上面用程序代码实现的功能。

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas./apk/res/android"    
  2.   
  3.  android:layout_width="fill_parent"  
  4.  android:layout_height="fill_parent"  
  5.  android:text="Hello, Android"  
  6.   
  7. />  

一般的Android XML Layout 文件 结构非常简单。它由树形的标记组成,每一个标记都是一个View类。在上面这个例子中只有一个元(element)-TextView。你可以在XML layout中使用任何一个继承自View的类,也包括你自己定义的类。这样简单的结构和语法使我们能够比使用代码更快的创建用户界面。它的灵感来自Web开发中用户界面与程序逻辑分开的模式。

 

这个例子中只有4个XML属性,下面列出含义:

android:layout_width

                                         这个属性定义了使用宽度,磁力中使用最大可用宽度。

android:layout_height

                                          同上,使用可用的屏幕高度

android:text 

TextView显示的文字内容,这个例子中显示 "Hello, Android                   

 

这就是XML layout的内容,但是该将它放在那里呢?在项目的res/ 目录中。这个"res"是对"resources"的缩写,这个目录中存放项目中所有不是代码的资源或文件。包括:图片,本地字符串,XML layout文件。

 

Eclipse插件已经为我们创建了这些XML文件。在我们上面的例子中,我们根本没有使用过他们。在Package Explorer中展开res/layout,目录,修改其中的main.xml文件。使用上面的文本替换掉他的内容。现在从Package Explorer中的源代码文件夹中打开R.java文件,你将看到如下内容:

Java代码 复制代码
  1. public final class R {    
  2.   
  3.    public static final class attr {   
  4.    };   
  5.    public static final class drawable {   
  6.        public static final int icon=0x7f020000;   
  7.    };   
  8.    public static final class layout {   
  9.        public static final int main=0x7f030000;   
  10.    };   
  11.    public static final class string {   
  12.        public static final int app_name=0x7f040000;   
  13.    };   
  14. }  

 

项目中的R.java文件是对文件中所有定义资源的索引。可以用最简单的方式在代码中使用项目中定义的资源。利用Eclipse的代码提示功能可以更快找到需要的内容。

 

其中最重要的两个内部类就是"layou"和"main"。Eclipse插件会根据你在XML layout文件中更改自动生成R.java文件。当时你在项目中添加了其他资源后你会先R.java会马上发生变化。

 

最后一件事就是你要修改你的HelloAndroid 代码,让程序使用XML layout文件定义的界面而不是采用我们以前的硬编码方式。看看现在的代码,简单多了:

Java代码 复制代码
  1. public class HelloAndroid extends Activity {    
  2.   
  3.    /** Called when the activity is first created. */  
  4.    @Override  
  5.    public void onCreate(Bundle icicle) {   
  6.        super.onCreate(icicle);   
  7.        setContentView(R.layout.main);    
  8.    }   
  9. }   

 

不要简单的拷贝粘贴来修改文件,试试R类的代码自动完成,这是你或许感觉到R类的作用了。

 

好,现在你已经完成了修改,让我们重新运行一下程序---你要做的就是点击以下有绿色箭头图标的Run按钮,或者选择Run>Run菜单来运行。你会看到和以前相同的结果。我们可以看出两种不同的布局方法结果是相同的。

 

我们只是对XML layouts有了个大概的了解,你需要阅读用户界面部分的完整文档来获取进一步的信息。

 调试程序

Android的Eclipse的插件也能够完美的与Eclipse的调试器集成。为了证实这一点,我们来做一个简单的测试。将你HelloAndroid 程序的代码改成这样:

这段代码很明显将产生一个NullPointerException 异常。运行后你看到:

Java代码 复制代码
  1. public class HelloAndroid extends Activity {    
  2.   
  3.   /** Called when the activity is first created. */  
  4.   @Override  
  5.   public void onCreate(Bundle icicle) {   
  6.       super.onCreate(icicle);   
  7.       Object o = null;   
  8.       o.toString();   
  9.       setContentView(R.layout.main);   
  10.   }   
  11. }  

 

为了找出错误,我们在"Object o = null;"这一行设置一个断点(你可以通过双击eclipse编辑器行号左边的空余部分来创建)。选择 Run > Debug菜单进入到调试模式。你的程序在模拟器中重新启动,但是这次程序会在运行到断点的地方停住。就行你在其他开发工具中那样,你可以在Eclipse的Debug Perspective中检查代码。

不使用eclipse创建项目

如果你不使用Eclipse(比如其他IDE或者是使用简单的文本编辑器和命令行工具),那么Android的Eclipse插件就帮不了你了。但是别太担心--你不会因为不使用Eclipse而失去某些功能。

 

Android 插件实际上只是对SDK里面的工具做了一下封装。因此可以使用其他工具来封装这些工具,比如‘ant‘来编译文件。(像emulator, aapt, adb, ddms这些工具都可以在文档中找到使用的方法)

 

Android SDK 同时包含了一个名称为"activityCreator.py"的Python的程序脚本,用来创建项目中的代码和目录,以及一个兼容‘ant‘的build.xml文件。这使得你可以通过命令行或者使之与其他的IDE工具集成。

 

例如,创建一个想刚才我们在eclipse中创建的HelloAndroid 项目,你可以使用这样的命令:

activityCreator.py --out HelloAndroid com.google.android.hello.HelloAndroid

为了编译这个项目,你必须使用ant命令。当命令成功完成后,你可以在‘bin‘目录中找到一个HelloAndroid.apk文件。这个.apt文件就是一个Android 包,你可以使用‘adb‘工具把它安装到模拟器中。

 
 

Android 文档的阅读顺序

因为看了看Android Blog, 在最新的文章里面介绍了几篇文章,其中一篇是<<以开发者的眼光来看Android SDK>>,作者在其中分析了的关于DOC的阅读顺序引起了我的兴趣,确实,那么多的文档,应该怎么看呢?哪些是必须先弄明白的?哪些应该先知道个大概,今后引用的时候再细细阅读?现在简要的介绍一下原作者的观点,希望能帮上你的忙。

1.
首先当然是要知道,什么是Android
2.
读一下Anatomy of an Android Application 能够知道一个Android application 中到底都有些什么东西
3.  
接着可以读一下 Development Tools 文档
4.  
然后可以看一下关于什么周期的文章 Lifecycle of an Android Application
5.
现在可以动手了,玩玩hello world 吧,Hello Android
6.
回去读一下 Installing the SDK文档,再这篇文章的后半部分讲了很多关于Debug的功能和技巧
7.
开始Notepad Application 的制作和学习吧,如果你真正弄懂了关于这个应用程序的4个练习,你已经从菜鸟开始转向高手喽。
8. Developing Android Applications
花了很多时间来介绍更多的细节,包括如何实现UI,数据存储和读取,安全问题等
9.
最后,你现在可以自由的漫步在links中了,找你感兴趣的读读吧。
 
 
 
 
 
 
 
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多