Android 应用中的整洁代码

工程 | Roy Clarkson | 2011年8月26日 | ...

假设有一天早上醒来,你心想:“嘿,我今天要做一个 Android 应用!”首先,这是个不错的选择!截至六月底,每天有 500,000 台 Android 设备被激活,甚至超过了 iPhone。这意味着你的应用有庞大的潜在用户群体。此外,Android 是用 Java 构建的。这看起来可能没什么大不了,但我已经在 iOS 平台上用 Objective-C 工作了几年,虽然现在已经很熟悉了,但 iOS SDK 的学习曲线比我在 Android 上的经历要陡峭。当我第一次使用 Android SDK 时,感觉 Android 更容易上手。话虽如此,它与你过去构建过的任何其他 Java 应用都有一些明显的区别,我将在第一部分介绍其中的一些。

时间快进,你已经完成了第一个应用,并将其提交到 Android Market。恭喜你,你的朋友们都在下载你的应用并发推特分享。现在是时候开始你的第二个应用了。你花了几天下,突然意识到你开始重用第一个应用的代码,这本身不是坏事。代码重用很有价值。但你注意到有很多样板代码倾向于频繁重复,这会分散你对业务逻辑的关注。幸运的是,有一些方法可以改进这一点。

在这篇博文中,我将概述 Android 和应用生命周期,并讨论框架施加的一些限制。我还将介绍一些技术和第三方项目,它们可以帮助你清理 Android 代码,并专注于你想通过应用实现的目标。

Android 概述

让我们先简要概述一下 Android 的工作原理。Android 应用(apps)使用 Java 构建,并编译成 class 文件。这些 class 文件随后被编译成 Dalvik 可执行文件 (DEX) 格式,以便它们可以在 Android 使用的 Dalvik 虚拟机上运行。转换为 DEX 格式后,class 文件被打包成 Android 包 (APK),以便分发到设备。由于使用了 DEX 格式,Dalvik VM 不是真正的 Java 虚拟机,因为它不操作 Java 字节码。此外,Dalvik VM 的核心类库基于 Apache Harmony 项目的一个子集。这意味着你在 Java SE 中习惯的许多类和方法是可用的,但肯定不是全部。我发现 Android 开发者网站上的 API 参考文档是回顾这些差异的宝贵资源。

默认情况下,每个 Android 应用都会被 Android 操作系统分配一个唯一的 Linux 用户 ID。当由系统启动时,应用会在自己的 Linux 进程中、自己的虚拟机 (VM) 内运行。系统根据需要管理此进程的启动和关闭。正如你所料,这意味着每个应用都与其他正在运行的应用隔离运行。安装时,应用可以请求访问硬件功能或与其他应用交互的权限。用户可以选择授予这些权限,或者不安装该应用。应用所需或请求的权限在每个应用的 Android Manifest 文件中定义。这是一个 XML 文件,列出了应用的所有组件以及这些组件的任何设置。应用组件有四种类型:活动 (activities)服务 (services)内容提供者 (content providers)广播接收者 (broadcast receivers)。为了本文的目的,我将重点关注活动 (activities)。

活动 (Activities) 基本上代表 Android 应用的一个单一屏幕。例如,一个 Twitter 应用可能有登录屏幕、推文列表屏幕和编写新推文的屏幕。这些屏幕中的每一个都代表应用内的不同活动 (activities)。作为开发者,你永远不会自己实例化一个活动对象。活动是通过发送一个称为 Intent 的异步消息来激活的,如下例所示。


startActivity(new Intent(context, HomeActivity.class));

当调用 startActivity(Intent intent) 时,系统会创建新实例或重用现有实例,以便向用户显示活动。重要的一点是,系统控制着应用和每个活动的启动、停止、创建和销毁。如果你想与这个过程交互,那么应用和活动类提供了针对不同 生命周期事件 的方法,你可以在子类中覆盖这些方法。

依赖注入

Spring Android 项目最近发布了它的 第四个里程碑 版本。通过这个版本,我们继续改进了对 Android 的 RestTemplateSpring Social 支持,这简化了进行 RESTful HTTP 请求和访问受 OAuth 保护的 REST API 的过程。虽然我们认为这些对于 Android 开发是宝贵的补充,但一些开发者提出了关于 Spring Android 中是否支持依赖注入的问题,因为正如你可能知道的,Spring Framework 已经为企业 Java 应用中的依赖注入提供了一个流行的控制反转 (IOC) 容器。在 Spring Android 规划的早期阶段,依赖注入支持被确定为可能纳入项目的候选功能。当时,尚不清楚这种支持会涉及什么,以及如何实现。因此,我开始研究和调查在 Android 中进行依赖注入的可能方法和局限性。

那么,什么是依赖注入?如果你问两个不同的开发者,你可能会得到两个不同的答案。你可能会听到关于 IOC、XML 文件、注解或其他实现细节的说法。实际上,依赖注入只是一种通过将对象所需的东西交给它来减少耦合的技术,而不是让对象自己去环境中获取。这听起来很简单,你可能在想,这已经可以通过类构造函数和 setter 方法实现,这是完全正确的。然而,回顾上面概述部分,Android 系统驱动着应用的生命周期,因此我们实现这种注入的方式是有限的。

Android 的方式

不使用任何第三方库,向 Activity 传递依赖项相当容易。正如前面讨论的,系统创建应用实例。因此,通过扩展 application 类,你可以有效地创建一个单例依赖项实例,该实例可以被应用中的任何 activity 访问。


public class MainApplication extends Application  {

    private MyService service;

    @Override
    public void onCreate() {
        super.onCreate();
        service = new MyServiceImpl();
    }

    public MyService getMyService() {
        return this.service;
    }
}

Activity 类有一个名为 getApplication() 的方法,它返回拥有该 Activity 的 application 对象的引用。我们只需将其转换为 MainApplication 类型,就可以访问 MyService 的 getter 方法。当然,现在 Activity 必须“知道”application,这可能看起来是一个缺点。但请记住,activity 已经知道它的 application 了。这个方法是内置的。


public class MainActivity extends Activity  {

    private MyService service;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainApplication app = (MainApplication…

特性导览

版本发布 | Chloe Jackson | 2011年8月26日 | ...

Spring 使你能够专注于业务问题,而不是连接组件和系统的底层实现。从核心框架到基础设施和数据服务,带你了解 Spring 的关键特性,学习如何构建、运行和管理现代 Java 应用。开始 很容易,现在就可以行动。

 

Spring Framework 特性

Spring Framework 帮助你更快地构建 Java 应用,因为它让你专注于业务问题,而不是连接组件和系统的底层代码。Spring 的特性包括:

现代 Web

全面支持现代应用,包括 REST、HTML 5、会话和 AJAX。
查看更多...

数据访问

支持传统 RDBMS 以及新的 NoSQL 解决方案、map-reduce 框架和基于云的数据服务。
查看更多...

集成

企业级编排以及用于分布式应用、基于异步消息的应用和批处理应用的适配器。
查看更多...

移动

为包括 Android 和 iPhone 在内的移动客户端平台提供 Web 支持。
查看更多...

社交

与 Facebook、Twitter、LinkedIn 等主要社交网络集成。
查看更多...

安全

为所有层提供授权控制,并与数十家提供商进行身份验证集成。
查看更多...

云原生

Spring 应用支持所有流行的云平台,如 Cloud Foundry、Google App Engine 和 Amazon EC2。
查看更多...

   

Spring 的主要优势


模块化

Plain old Java Objects(普通 Java 对象)使你的代码简洁、简单且模块化

 

生产力

超过 70% 的开发者表示使用 Spring 提高了生产力并缩短了部署时间

 

可移植性

应用可在 Tomcat、所有 Java EE 服务器以及云平台上运行

 

可测试性

清晰表达的依赖关系使单元测试和集成测试更容易

 

Spring 入门

新闻 | Chloe Jackson | 2011年8月26日 | ...

Spring 提供了一系列极其强大且灵活的技术集合,用于改进企业 Java 应用开发,被数百万开发者使用。通过使用我们的免费开发工具 Spring Tool Suite 或 mengikuti 众多 教程 中的一个,即可轻松入门。如果你有具体问题,可以在 社区论坛 中提问,在大量的 代码示例 中寻找解决方案,或者查阅优秀的 Spring 文档

 

获取你需要的一切

Spring Tool Suite™ 提供了最佳的基于 Eclipse 的开发环境,用于构建由 Spring 驱动的企业应用。STS 提供了使用最新的企业 Java 和基于 Spring 的技术进行开发所需的所有工具。

开始学习教程

如果你是 Spring 的新手或需要学习新特性,我们的教程会简单地解释关键概念,并提供如何完成特定任务的分步说明。借助截屏视频、示例代码和专家提示,你可以按照自己的节奏掌握 Spring。
前往教程...

 

获取代码示例

Spring 代码示例为你提供了可以直接在应用中使用的精确代码。这些示例由 Spring 专家编写,并确保你的应用遵循最佳实践。
前往示例...

 

阅读文档

Spring 文档详细准确地涵盖了平台的各个方面。如果你需要查找关于 API 的具体信息或了解 Spring 的内部工作原理,请查阅我们全面深入的技术出版物。
前往文档...

提问 (论坛)

有问题吗?Spring 论坛是一个活跃的资源,每天都有成千上万的用户提问和解答问题。
前往论坛...

 

参加课程 (培训)

SpringSource University 是你获得以开发者为中心的教育的终极来源。你可以在课堂环境或在线直播中参加我们的开源课程,以更好地理解 Spring Framework、Apache Tomcat 和其他开源项目,并获得 Spring 认证。
前往培训...

 

视频教程

SpringSourceDev YouTube 频道提供了完整的 Spring 演示和技术截屏视频存档。这些由 Spring 专家录制的视频为所有技能水平的开发者提供了开发指南和技巧。
前往频道...

 

Spring AMQP 1.0 GA 发布

版本发布 | Mark Fisher | 2011年8月25日 | ...

我们很高兴地宣布 Spring AMQP 1.0 GA (Java 版) 已经发布!你可以在 Spring AMQP 主页 找到所有资源的链接(文档、示例、源代码、论坛、问题跟踪器等)。构建产物可以在 SpringSource Maven 仓库 以及 Maven Central 中获取。

该项目在其里程碑和候选发布阶段非常受欢迎,我们要感谢社区中提供了宝贵反馈并在此过程中提出了 JIRA 问题的各位。我们期待着社区现在能进一步壮大……

Spring Social 1.0.0.RC3 发布

版本发布 | Craig Walls | 2011年8月25日 | ...

亲爱的 Spring 社区成员:

我们很高兴地宣布 Spring Social 的 1.0.0.RC3 版本发布,其中包括 Spring Social Facebook 和 Spring Social Twitter 的 1.0.0.RC3 版本。Spring Social 允许你的 Java 应用连接到诸如 Facebook 和 Twitter 等软件即服务 (SaaS) 提供商。

本版本修复了自 1.0.0.RC2 以来报告的 Bug,并包含了一些改进:

  • ConnectInterceptor 实现现在可以将参数添加到授权 URL。
  • Twitter TimelineOperations.updateStatus() 改进
    • 现在可以在更新状态时上传照片。
    • TimelineOperations.updateStatus() 现在返回一个新发布的推文的 Tweet 对象。
    • 现在可以将状态发布为对现有状态的回复。
  • 示例应用集已更新,新增了两个示例:一个演示基于弹出窗口的连接流程,另一个演示在 Facebook Canvas 应用中使用 Spring Social。

请查看变更日志了解本版本的新特性 (核心 | Facebook | Twitter)

要获取软件,请下载发布版本 (核心 | Facebook | Twitter) 或直接将 maven artifact 添加到你的项目中。要查看实际运行效果,请按照 快速入门 操作并启动 展示应用 (已更新至 1.0.0.RC3)。随时查阅 参考手册 补充信息。

Spring Social 需要 Spring Framework 3.0.5 或更高版本才能运行。对于新应用,我们推荐使用 Spring 3.1,以便利用核心框架的最新进展。有关依赖项的完整说明,请参阅参考手册。

我们预计这将是 Spring Social 1.0.0 的最后一个候选发布版本,并预计很快就会发布 Spring Social 1.0.0 GA 版本。因此,我们强烈建议你尝试这个候选发布版本,并在 论坛 中向我们提供反馈,或者,如果你有任何建议或发现任何错误,请将其发布到 问题跟踪器 中。

希望你喜欢使用 Spring Social!

Spring 3.0.6 现已可用

版本发布 | Adam Fitzgerald | 2011年8月24日 | ...

虽然大家的焦点大多集中在 Spring 3.1 的新特性上,但重要的是要记住 3.0.x 分支仍在更新。上周,我们悄无声息地看到了 Spring 3.0.6 的发布。此版本解决了 50 多个小问题,并包含约十二项小改进。请务必阅读变更日志以获取所有详细信息。

下载 | 文档 | Javadoc API | 变更日志 | JIRA

不要忘记 Spring 用户可以在 社区论坛 中提问,也可以在 JIRA 中报告问题。

本周的 Spring:2011年8月23日

工程 | Josh Long | 2011年8月24日 | ...

欢迎来到又一期《本周的 Spring》。随着下周 VMworld 2011 的临近,一切都在快速进行。我想邀请所有与会者到 VMWorld Spring 展位与我们的专家技术人员交流。如果你阅读了这周报,请告诉我。本周有很多内容要讲,让我们开始吧!

    <li>The preliminary session schedule has been published for <a href="http://www.springone2gx.com">SpringOne 2GX 2011</a>. This year's show is going to be another fantastic mix of deep technical content, cutting edge development and the absolute best place to learn about everything in the Spring universe. Be sure to <a href="http://springone2gx.com/conference/chicago/2011/10/register">register now</a>!</li>
    
    <LI> <a href="http://static.springsource.org/spring/docs/3.0.6.RELEASE/changelog.txt">Spring 3.0.6's was just released!</a>   		 
    	 This release addresses over 50 minor issues and includes…

面向 Spring 开发者的 Micro Cloud Foundry

工程 | Josh Long | 2011年8月24日 | ...

今天,VMware 团队发布了 Micro Cloud Foundry,它是流行的开源平台即服务 (Platform as a Service) 的完整本地版本,允许开发者在 Mac 或 PC 上运行功能齐全的云环境。使用 Micro Cloud Foundry,开发者可以在本地构建端到端云应用,无需繁琐地配置中间件,同时保留了部署地点的选择权,并且无需修改一行代码即可扩展其应用。

Micro Cloud Foundry 当然支持 Spring 和 Java,但也提供了 Scala、Node.js 和 Ruby 的运行时环境,让你释放内心的 多语言程序员 特质!Micro Cloud Foundry 还提供了许多服务,如 MongoDB、MySQL 和 Redis,这些服务都可立即使用,无需进行大量安装和配置。凭借内置的动态 DNS 支持,开发者无论是在家、办公室还是咖啡馆工作,都可以在任何地方运行他们的 Micro Cloud Foundry,无需进行任何重新配置。在 Micro Cloud Foundry 上创建和测试你的应用后,你可以轻松部署你的...

从 Grails 使用 Micro Cloud Foundry

工程 | Peter Ledbrook | 2011年8月24日 | ...

回到四月,VMware 向世界介绍了 Cloud Foundry,随之而来的是为 Grails 开发者提供的 超简单应用部署。快进几个月,现在拼图的另一块到位了:Micro Cloud Foundry。你现在可以拥有自己的 Cloud Foundry 实例用于测试或任何其他用例。当然,从 Grails 使用它也异常简单。

那么什么是 Micro Cloud Foundry?下面的截屏视频简要概述了该产品,然后带领你完成下载、安装和配置的过程。最后,你将看到如何...

STS Cloud Foundry 集成 2.7.0.M4 发布

版本发布 | Martin Lippert | 2011年8月24日 | ...

亲爱的 Spring 社区成员:

我很高兴地宣布 SpringSource Tool Suite (STS) 的 Cloud Foundry 集成发布了新的里程碑版本 2.7.0.M4。此里程碑版本包含对刚刚发布的 Micro Cloud Foundry 的支持,并允许你直接在 IDE 内注册用户。此外,此里程碑版本还包含对现有功能的许多修复和改进。

工具的安装说明和快速指南可在 SpringSource 团队博客中找到:从 STS 使用 Cloud Foundry

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助你加速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅,提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举办的活动

查看 Spring 社区所有即将举办的活动。

查看全部