安卓-4-入门指南-七-

149 阅读19分钟

安卓 4 入门指南(七)

原文:Beginning Android 4

协议:CC BY-NC-SA 4.0

四十七、其他替代环境

前面章节中描述的备选应用环境只是这些技术不断发展的一小部分。这里,我们将简要地看一下其他几个可供选择的应用环境。

**注意:**这个领域正在快速变化,所以当你读到这一章的时候,相对于这些技术已经取得的进步,这些材料可能已经有些过时了。查看每个应用环境的网站,获取最新的更新。

罗德斯

Rhodes ( [rhomobile.com/](http://rhomobile.com/))类似于 PhoneGap,因为您开发的 Android 应用的用户界面是通过 HTML、CSS 和 JavaScript 定义的。不同之处在于 Rhodes 在一个完整的 Ruby 环境中使用 Rails 风格的框架。您的 Ruby 代码生成 HTML,并通过一个WebView小部件“提供”给一个活动,就像服务器端的 Ruby web 应用生成 HTML 提供给一个独立的 web 浏览器一样。

与 PhoneGap 类似,您可以在您的开发机器上构建项目,也可以使用他们的托管构建流程 RhoHub。推荐后一种方法,部分原因是对本地构建的要求高于 PhoneGap——值得注意的是,Rhodes 需要本地开发工具包(NDK)来构建 Ruby 解释器并将其链接到您的应用。

由于 Ruby 解释器的开销(大约 1.5MB),Rhodes 最终创建了比 PhoneGap 更大的应用。但是,如果你习惯于服务器端的 web 开发,那么对你来说,拿起 Rhodes 可能比拿起 PhoneGap 更容易。

Rhodes 与众不同的一个方面是提供一组连接器和一种称为 RhoConnect 的服务器端服务,所有这些都是为了在 Rhodes 开发的 Android 应用和各种企业和商业系统之间提供集成。

闪光、弯曲和空气

Adobe 长期努力将其 Flash、Flex 和 AIR 技术扩展到移动领域。历史上,你可以使用 Flex(“Hero”版)和 Flash Builder(“Burrito”版)来创建 Android APK 文件,这些文件可以在 Android Market 上分发并部署到 Android 设备上。这些设备需要安装 Adobe Integrated Runtime (AIR ),这是免费的,但下载量很大,只能在采用新款 ARM 处理器的 Android 2.2 或更高版本的设备上运行(具体来说,ARM v7 或更高版本的处理器,因此一些运行 Android 2.2 或 2.3 的早期型号设备就不太走运了,如 LG Optimus V)。

然后在 2011 年 11 月,Adobe 宣布移动设备(Android 和其他平台)将不再使用 Flash。如果你读了上一章关于 PhoneGap 的内容,你可能会对 Adobe 在移动领域的发展方向得出自己的结论。Adobe 无疑已经在工具领域收集了大量技术和知识来构建 Flash 代码,然后将其转换为 HTML5 和相关的非 Flash 技术。只有时间才能证明这一举措在移动领域是否成功。

AIR 不像 PhoneGap 那样与平台紧密集成(例如,AIR 不提供对设备联系人的访问),尽管 Adobe 现在可能会在这一领域投入更多资源,可能会利用其通过收购 Nitobi 获得的专业知识。

JRuby 和 Ruboto

JRuby ( [www.jruby.org/](http://www.jruby.org/))是设计用于在 JVM 上运行的最流行的语言之一——除了 Java 本身。JRuby 很快被移植到 Android 上运行,但禁用了一些优化,因为 JRuby 实际上运行在 Android 环境底层的 Dalvik 虚拟机上,而不是在经典的 JVM 上。

然而,仅靠 JRuby 无法创建 Android 应用。作为一种脚本语言,它无法定义一个活动或其他组件——这些需要在应用的清单中注册为常规的 Java 类文件。

这就是 Ruboto ( [ruboto.org/](http://ruboto.org/))的用武之地。Ruboto 是一个通用 JRuby/Android 应用的框架。它通过代码生成器提供框架活动,并允许 JRuby 脚本为所有生命周期方法定义处理程序(例如,onCreate()),使用 JRuby 代码定义用户界面,等等。可以使用提供的 Rake 脚本将结果打包成 APK 文件。搜索结果可以上传到 Android Market,也可以按照你的意愿进行分发。

安卓版单声道

Mono 是 C#和。NET 用于非 Windows 环境。Mono 也有相当多的争议,大部分来自微软,比如微软是否有一天会因为专利考虑而压制 Mono。

Android 版 Mono 已经开发了一段时间。这将允许 Mono 开发者将 Android 作为他们应用的目标。原则上,人们可以这样为 Android 开发 C#应用。

虽然 Mono 本身是一个开源项目,但 Mono for Android“是一个商业产品...基于每个开发者的许可”,由 Xamarin ( [android.xamarin.com/](http://android.xamarin.com/))主持。对于期待 Android 上的 Mono 保持开源的开发者来说,这可能有点令人震惊。截至 2011 年底,Xamarin 网站列出的价格从每位开发者 399 美元起。

应用发明者

App Inventor ( [appinventor.googlelabs.com/](http://appinventor.googlelabs.com/))是一款 Android 应用开发工具,由谷歌提供,但不在正常的 Android 开发者网站之内。App Inventor 最初是为教育开发的,但谷歌一直在邀请其他人进入他们的封闭测试版。

App Inventor 理论上是一个基于 web 的开发工具。在这里,“理论上”意味着,在实践中,用户必须在浏览器之外做大量的工作来设置一切:

  • 在浏览器中安装并运行 Java 1.6 或更高版本,能够运行 Java Web Start ( .jnlp)应用
  • 下载并安装大型(~55MB)客户端工具集

设置完成后,App Inventor 会为您提供一个拖放式 GUI 编辑器,如图 Figure 47–1 所示。

images

**图 47–1。**App 发明者“设计者”查看

App Inventor 还为您提供了一个块编辑器(参见 Figure 47–2),您可以通过将代表事件、方法和属性的各种“块”捕捉在一起,将行为附加到事件(例如,单击按钮)。

images

**图 47–2。**App Inventor Blocks 编辑

在 GUI 编辑器中工作时,如果您选择直接在连接的设备上构建您的应用,您可以在连接的设备上实时查看您正在构建的内容,并可以对其进行实时测试。稍后,当您准备好了,您可以将应用打包成一个标准的 APK 文件。

但是,App Inventor 目前并未真正用于生产应用:

  • 您不能在 Android Market 上分发 App Inventor 应用。谷歌声称这是由于技术上的限制,目前正在积极解决,但这种状况在 2011 年的大部分时间里都没有改变。
  • 它有更多的组件旨在“sizzle”(例如,Twitter 集成),而较少的组件提供典型的现代应用可能需要的功能(例如,关系数据库和列表)。
  • 共享开发是原始的,额外的开发人员上传和下载项目代码的 ZIP 文件。
  • 也许最大的限制是它的单屏幕焦点,这意味着在不同屏幕上进行额外的活动超出了 App Inventor 的范围。

在未来,App Inventor 可能会成为一个可靠的选择,或者 App Inventor 会引发其他公司为 Android 创建类似的免编程开发选项。

钛金属手机

Titanium Mobile 之所以出名,是因为它只使用 JavaScript 来定义用户界面,而完全避开了 HTML。它的 JavaScript 库除了提供对数据库和平台功能的访问之外,还允许您声明用户界面小部件。但是其用于定位所述窗口小部件的布局能力还有待改进。

在撰写本文时,Titanium Mobile 的创建者 Appcelerator ( www.appcelerator.com/)还没有提供一套基于云的工具。它确实提供了一个名为 Titanium+Plus 的程序,提供额外的 SDK 组件来与 Twitter 和 PayPal 等其他基于云的服务进行对话。它的 Titanium 工具有一个看起来非常光滑的 UI,但它仍然需要 Java SDK 和 Android SDK 才能构建 Android 应用,这使得设置对一些人来说有点令人生畏。

在撰写本文时,Titanium Mobile 支持 Android 和 iOS 开发。处于私人测试阶段的黑莓支持计划似乎已经暂停。

其他 JVM 编译语言

如果你喜欢常规的 Android 开发,但是你不喜欢 Java,任何可以生成兼容的 JVM 字节码的语言都应该可以在 Android 上工作。您必须修改另一种语言的构建链来完成 Android 构建过程的其余部分(例如,从资源中生成R.java并最终创建 APK 文件)。

Scala ( [www.scala-lang.org/](http://www.scala-lang.org/))和 Clojure ( [clojure.org/](http://clojure.org/))就是两种这样的语言,它们的社区已经将使用它们的语言进行 Android 开发的指令放在了一起。

四十八、处理设备

Android 是开源的,设备制造商可以免费获得。因此,当设备制造商将 Android 安装到他们的设备上时,他们可以全权委托 ?? 做他们想做的事情。这意味着设备用户有了更多的选择,他们可以在各种形状、尺寸和颜色的 Android 设备中进行选择。这也意味着开发者需要考虑一些设备差异和特性。

本章将为您提供一些处理这些设备特定问题的技巧和建议,以配合前面章节中关于屏幕尺寸的内容。

此应用包含明确的说明

最初,唯一的 Android 设备是 T-Mobile G1。因此,如果您正在编写一个 Android 应用,您可以假设存在一个硬件 QWERTY 键盘、一个用于导航的轨迹球等等。然而,现在有数百种其他设备存在,其中许多具有不同的硬件功能(例如,无键盘、多屏幕、游戏控制器按钮等等!).

理想情况下,不管是否存在各种类型的硬件,您的应用都可以工作。但是,如果没有某些硬件特性,一些应用将无法使用。例如,全屏游戏可能依赖硬件键盘或轨迹球来指示玩家的动作,软键盘和触摸屏可能不够用。

幸运的是,从 Android 1.5 开始,您可以添加明确的指令,告诉 Android 您需要什么,这样您的应用就不会安装在缺乏此类硬件的设备上。我们现在来看看这个,然后继续讨论隐含的特性请求。

明确的功能要求

除了使用目标 ID 系统来指示项目所针对的设备级别之外,还可以使用一个AndroidManifest.xml元素来指定应用正常运行所需的硬件。您可以在<manifest>元素中添加一个或多个<uses-configuration>元素。每个<uses-configuration>元素指定您的应用将使用的一个有效的硬件配置。目前,您可以通过这种方式指定五种可能的硬件要求:

  • android:reqFiveWayNav:表示您需要某种形式的五向导航指向设备(如android:reqFiveWayNav = "true")
  • android:reqNavigation:将五向导航定位设备限制为特定类型(如android:reqNavigation = "trackball")
  • android:reqHardKeyboard:指定是否需要硬件(物理)键盘(如android:reqHardKeyboard = "true")
  • android:reqKeyboardType:与android:reqHardKeyboard一起使用,表示需要特定类型的硬件键盘(如android:reqKeyboardType = "qwerty")
  • android:reqTouchScreen:指示需要哪种类型的触摸屏(如有)(如android:reqTouchScreen = "finger")

从 Android 1.6 开始,有一个类似的 manifest 元素<uses-feature>,用于记录应用对 Android 设备上其他可选功能的需求。例如,以下属性可以放在一个<uses-feature>元素中:

  • android:glEsVersion:表示您的应用需要 OpenGL,其中属性的值表示 OpenGL 支持的级别(例如,0×00010002表示 OpenGL 1.2 或更高版本)
  • android:name = "android.hardware.camera":表示您的应用需要一个摄像头
  • android:name = "android.hardware.camera.autofocus":表示您的应用特别需要自动对焦摄像头

每个 Android 版本都添加了更多您可能需要的功能。一个很好的例子是最近添加的android:hardware:nfc功能,用于使用近场通信(NFC)。这些请求将导致 Android 市场——以及其他第三方市场,我们希望——过滤掉你的应用,使其不能被加载到不适合它的设备上。

<uses-feature>元素有一个您可以指定的android:required属性。默认情况下,它被设置为true,这意味着您的应用绝对需要这个特性。如果您将它设置为false,那么您的应用可以利用这个特性,如果它存在的话,但是并不绝对需要它。要在运行时发现该功能是否存在于设备上,您可以使用PackageManager上的hasSystemFeature()方法询问设备。

隐含特性请求

如果你请求了类似CALL_PHONESEND_SMS的权限,除非你采取适当的步骤,否则你的应用将无法在摩托罗拉 XOOM 上使用,也无法在其他只有 Wi-Fi 的 Android 平板电脑上使用。

有些权限意味着您需要某些硬件功能。向下滚动到<uses-feature>页面上的“隐含特性需求的权限”部分,找到列表。1

Android Market 将类似CALL_PHONE的许可请求视为对以下内容的请求:

<uses-feature android:name="android.hardware.telephony" />

XOOM 是第一款没有电话功能的 Android 设备;其他几款设备也紧随其后。虽然 XOOM 可以有数据计划,但它没有语音或短信功能,因此被视为没有android.hardware.telephony。但是,如果你请求类似CALL_PHONE的权限,Android Market 默认会假设你需要 android.hardware.telephony。因此,你将被排除在 XOOM 的 Android 市场之外。

解决方案很简单:对于权限可能隐含的、但您的应用并不绝对需要的任何硬件特性,使用android:required="false"手动将适当的<uses-feature>元素添加到您的清单中:

<uses-feature   android:name="android.hardware.telephony"   android:required="false" />

然后,在你尝试打电话或发送短信或其他东西之前,使用PackageManagergetSystemAvailableFeatures()来确定设备上的android.hardware.telephony是否可用。例如,您可能会提前检查电话,并禁用各种菜单选项,如可能会引导用户拨打电话或发送 SMS 的按钮。

如果您的应用绝对需要电话,那么隐含的<uses-feature>将会工作,尽管您可能希望考虑显式地加入一个。然而,请记住,这意味着你的应用将无法在 XOOM 或其他缺乏电话功能的平板电脑上运行。

有保障的市场

正如本章介绍中提到的,Android 是开源的。具体来说,它主要是在 Apache 软件许可证 2.0 下提供的。该许可证对设备制造商几乎没有限制。因此,坦率地说,设备制造商很有可能制造出一款不能很好地运行 Android 的设备。它可能对设备上的标准应用工作良好,但在处理第三方应用(如您可能编写的应用)方面表现不佳。


1http://developer . Android . com/guide/topics/manifest/uses-feature-element . html

为了帮助解决这个问题,谷歌有一些应用,比如 Android Market,它没有作为开源软件发布。虽然这些应用可供设备制造商使用,但运行 Android Market 的设备首先要经过测试,以帮助确保用户对设备的体验是合理的。

因此,Android Market 在设备上的存在,除了为您的应用提供分发手段之外,还可以作为一种认可,即设备应该支持编写良好的第三方应用。具体来说,任何拥有安卓市场的设备

  • 符合兼容性定义文件(CDD)中概述的标准
  • 已通过兼容性测试套件(CTS)

其他各不相同的东西

不同设备之间的其他差异包括:

  • 有哪些定位技术可用(例如,GPS、手机信号发射塔邻近、伽利略)
  • 哪些相机功能可用(例如,闪光灯、自动对焦、深褐色调)
  • 哪些传感器可用(例如,加速度计、陀螺仪、气压计)

处理这些变量的策略是首先询问系统,找出有哪些可能性,然后决定使用哪一个,这个决定可以由您单独做出,也可以根据用户的输入做出。例如,您可以使用Criteria来确定哪一个是使用LocationManager的最佳位置供应器。

虫子,虫子,虫子

不幸的是,设备不可避免地会有 bug。有些 bug 确实是偶然的。有些是设备制造商为实现某些商业目标而做出的改变的副作用。有些实际上是有意的,尽管实现它们的工程师可能没有完全理解它们的后果。

对于这些错误,除了尝试绕过它们之外,你在战术上没有太多办法。android.os包中的Build类可以告诉你运行你的应用的设备的品牌和型号。这一点,加上您自己在某些问题上得来不易的经验,将帮助您确定需要从哪里绕过固件损坏。

从战略上来说,如果您发现某个东西明显是一个设备缺陷,您应该提交一个问题,通过 CTS 检测这个缺陷。CTS 应该过滤掉不能忠实运行 Android 应用的设备。然而,CTS 有许多漏洞,设备漏洞会钻过去。通过共同改进 CTS,我们可以帮助防止将来出现问题。您可以在 Android Bugs 的公共问题跟踪器[code.google.com/p/androidbugs/issues/list](http://code.google.com/p/androidbugs/issues/list)上提交问题。

设备测试

理想情况下,您应该尝试在各种硬件上测试您的应用。然而,这可能会变得昂贵。以下是一些成本更低的选择:

  • 注册 Keynote DeviceAnywhere 的独立开发人员计划,这是一种能够访问他们的设备群进行远程测试的低成本方式。
  • 一些设备制造商在各种活动中举办设备实验室,例如在 2011 年的 AnDevCon 上举办的摩托罗拉。
  • 一些运营商有永久性的设备实验室,比如 Orange 的开发者中心。
  • 作为 Meetup 或 Google Technology 用户组的一部分,您可以安排与 Android 开发人员进行短期(例如 15 分钟)设备交换。

四十九、我们将何去何从?

显然,这本书并没有涵盖一切。虽然您的主要资源(除了书籍之外)是 Android SDK 文档,但您可能需要来自其他来源的信息。

在网上搜索“android”和一个类名是找到引用给定 Android 类的教程的好方法。然而,请记住,Android 的变化速度意味着几年前编写的教程很可能是为更早的 SDK 版本编写的,因此,将需要相当大的调整才能在当前的 SDK 中正常工作。

你可以使用本章概述的一些资源来缩小搜索范围,而不是随意搜寻教程。

问题,有时有答案

获得安卓帮助的官方渠道是安卓谷歌小组。关于 SDK,有两点需要考虑:

  • Android 开发者([groups.google.com/group/android-developers](http://groups.google.com/group/android-developers)),获取 SDK 问答
  • Android discuse([groups.google.com/group/android-discuss](http://groups.google.com/group/android-discuss)),旨在自由讨论任何与 Android 相关的问题,不一定是编程问题和答案

您还可以考虑以下资源,尤其是 StackOverflow,它越来越被认为是获得帮助的最佳地方:

  • StackOverflow 的android标签([stackoverflow.com/questions/tagged/android](http://stackoverflow.com/questions/tagged/android))
  • 位于[www.anddev.org](http://www.anddev.org)的 Android 教程和编程论坛
  • 【Android wiki 的 Open Mob(http://andmob.wikidot.com/)
  • freenode 上的#android-dev IRC 通道([freenode.net/](http://freenode.net/))
  • JavaRanch 的 Android 论坛([www.coderanch.com/forums/f-93/Android](http://www.coderanch.com/forums/f-93/Android))

重要的是,特别是对于 StackOverflow 和 Google 团队来说,要写一些信息性的问题。以下是一些写有效问题的技巧:

  • 包括源代码的相关部分(例如,您遇到异常的方法)。
  • 如果问题是未处理的异常,则包括来自 LogCat 的堆栈跟踪。
  • 在 StackOverflow 上,确保你的源代码和堆栈跟踪被格式化为源代码;在 Google Groups 上,考虑在[gist.github.com](http://gist.github.com)或类似的代码粘贴网站上发布长列表。
  • 彻底解释你正试图做什么,你正试图如何做,以及你为什么这样做(尤其是如果你认为你的目标或方法可能有点与众不同)。做好准备,人们会试图引导你走向一个完全不同的方法,而不是真正试图帮助你解决当前的问题。考虑其他方法,但要小心不要损害你的愿景的完整性。
  • 在 StackOverflow 上,用你自己的评论来回应回答和评论,使用@语法(例如@CommonsWare)称呼对方,以最大化你得到回复的几率。
  • 在 Google Groups 上,不要“ping”或回复您自己的消息来试图获得回应,直到一段合理的时间过去(例如,24 小时)。

前往源头

Android 的源代码现在已经可以使用了,尽管比当前的 Android 4.0 版本落后了几个版本。大多数情况下,这是为那些寻求增强、改进或以其他方式对 Android 操作系统内部大惊小怪的人准备的。但是,您可能会在这些代码中找到您想要的答案,特别是如果您想了解一些内置的 Android 组件是如何工作的。

**注:**谷歌承诺将在不久的将来发布 Android 4.0 的源代码,冰激凌三明治。这样一个版本变得越来越重要,因为[source.android.com](http://source.android.com)上现有的版本是 2.3,这个版本已经过时了。正如 Google 之前所说,3.x 版本的源代码不太可能发布,因为 4.0 是所有未来版本的首选合并代码基础。

源代码和相关资源可以在[source.android.com](http://source.android.com)找到,在这里你可以做以下事情:

  • 下载或浏览源代码
  • 针对操作系统本身提交错误报告
  • 提交修补程序并了解如何评估和批准此类修补程序的流程
  • 加入一个独立的谷歌 Android 平台开发小组

与其下载数千兆字节的 Android 源代码快照,不如使用谷歌代码搜索([www.google.com/codesearch](http://www.google.com/codesearch))来代替。只需在您的搜索查询中添加package:android约束,它将只在 Android 和相关项目中进行搜索。

获取您的新闻信息

Ed Burnette 是一个好人,碰巧写了自己的 Android 书籍,他也是 Planet Android ( [www.planetandroid.com](http://www.planetandroid.com))的经理,Planet Android 是许多 Android 相关博客的聚合器。订阅 Planet Android 的 feed 可以让你监控相当多与 Android 相关的博客帖子,尽管这些帖子并不完全与编程相关。

为了更好地关注与编程相关、与 android 相关的博客文章,你可以在 DZone ( [www.dzone.com](http://www.dzone.com))中搜索“Android ”,并订阅基于该搜索的提要。

第一部分:核心概念

第二部分:活动

第三部分:蜂巢和平板

第四部分:数据存储、网络服务和 API

第五部分:服务

第六部分:其他 Android 功能

第七部分:替代应用环境

第八部分:不断发展的安卓系统