Android 应用程序架构

在本章中,您将了解在安卓系统的大块。我们将让你对活动有一个更深的认识,是如何有意识工作的,服务多到位,如何使用广播的接收器和内容提供商提升您的应用程序的规模,以及更多。

文章的末尾,你就会明白构建应用程序的主要 Android 组件。从概念上讲,你应该知道当你会使用什么组件。 您还将看到这些组件与一个真实的应用程序有何关系。

什么是Android 应用程序架构

Android 应用程序架构是作为应用程序开发员构建应用程序所使用的组件。他们都是概念性的项目,你放在一起以创建 更大的整体。当你开始思考你的应用程序时,最好的是采用自顶向下的方式,你设计你的应用程序取决于在它们中的屏幕,功能,和 相互作用。你开始的概念性的画图,你所表现出来的是以“直线和圆”而言的。这种应用程序开发的方法帮助你看清全貌 — — 组件是如何组合在一起,怎样使得它有意义。

实例

我们要建一个Twitter 应用程序,我们知道用户应该能够 发布状态更新。我们也知道用户应该知道他的朋友能胜任什么,这些都是基本的功能,除此之外,用户还应该能够设置自己的 用户名和密码,以便登录到她的 Twitter 账户。所以,现在我们知道了我们 应该有这三个屏幕。

接下来,我们想这个应用程序工作快不论网络连接或 断开。要实现这一目标,当应用程序在线 和本地缓存数据时它已从 Twitter 中提取数据。这将需要在后台运行的服务 以及一个数据库。

我们也知道,我们希望当设备最初被打开时,后台服务开始运行,因此在用户首次使用该应用程序,已有她朋友的最新信息。

这都是一些简单的要求。Android 的构造块使它容易 把它们分解成概念性的单元,你可以对他们独立工作, 然后轻松地放在一起成一个完整的软件包。

活动

活动通常是单个屏幕,用户在设备上看到一次。应用程序通常具有多个活动和用户翻转来来回回在他们之中。因此,活动是您应用程序最明显的部分。

我通常是使用网站作为类比而进行活动。就像一个网站包含多个页面,所以 Android 的应用程序包括的多个活动。就像某个网站具有"主页",Android 的应用程序有"主"的活动,通常这个活动第一次展示,当您启动应用程序时。就像一个网站要提供各个页面之间的导航,Android 的应用程序也应该这样做。

在微博上,你可以从一个页面跳转到另一个页面,同样,在安卓系统,你可以看一个应用程序的活动,但不久后你可以在一个完全独立的应用程序中开始另一项活动。例如,如果您是在您的联系人应用程序并且您选择文本的朋友,你会发起活动撰写消息应用程序中的文本消息。

活动生命周期

发起一项活动可以是相当昂贵,它可能涉及创建一个新的 Linux 进程、 为所有的 UI 对象分配内存、 膨胀从 XML 布局的所有对象和设置整个屏幕 。把它扔掉将是一种浪费一旦用户离开屏幕。为避免这种浪费,活动生命周期将由活动管理器管理,例如,当用户第一次使用应用程序

活动管理器负责创建、 销毁、 和管理活动,活动管理器将创建它的活动,并把它放到屏幕上。后来,当用户切换屏幕,活动管理器将那以前的活动移至一个位置保存。这种方式,当用户想返回到原来的活动,它可以更快地开始。如果用户未使用在一段时间的老活动将被销毁以释放更多 当前活动的的空间。这一机制被用来帮助改善用户界面的速度,从而提高了整体的用户体验,对于某些其他环境安卓系统编程是在概念上不同于编程,在 Android 中,你发现自己更响应应用程序状态中的某些更改,而不是推动这种改变自己,它是一个托管、 基于容器的环境类似于 Java 小程序或 servlet 的编程。所以一提到生命活动周期,你不能说活动是处于什么状态,但你有足够的机会,说发生在过渡期间从一个状态到另一个状态的事情。图 4-1 显示的活动可以顺利通过的状态。

图4-1 生命活动周期

起始状态

当一项活动并不存在于内存中时,它处于起始的状态。虽然它起步的时候,活动会通过一整套你作为一个开发人员有机会填写的回调方法。最终,活动将在运行状态。

请记住,这从起始状态到运行状态的过渡是在计算时间,最昂贵的手术之一,这也直接影响到设备的电池寿命,这是为什么我们不自动销毁活动不再显示的确切原因。用户可能想要返回来找他们,所以我们保留他们一段时间。

运行状态

活动的运行状态是目前在屏幕上与用户进行交互,我们也说这个活动是焦点,这意味着所有的用户交互---如打字,触摸屏幕,单击按钮---由这一个活动负责。因此,只有一个运行活动在任何给定的时间。

正在运行的活动是有优先级的内存和资源需要尽可能快地运行。这是因为Android希望确保运行活动是生机勃勃的并响应用户。

暂停状态

在一个活动(即焦点。与用户交互,而不是在屏幕上),但仍可见,我们说它是处于暂停状态。这不是一个典型的场景,因为设备的屏幕通常是小的,一个活动占据了整个屏幕或没有。我们经常看到这种情况下对话框出现在一项活动之前,使其停了下来。所有活动通过暂停状态的途中被停止了。

暂停活动仍有高优先级的内存和其他资源。这是因为他们是可见的,在用户没有使它看起来很奇怪时不能从屏幕中删除。

停止状态

当一个活动是不可见的,但仍然在内存中,我们说它是处于停止状态。可以带回前停止活动再次成为一个正在运行的活动。或者,它可能被摧毁,从内存中删除。

系统保持在停止状态的活动,因为用户很可仍想回到这些一段时间不久的活动,和重新启动停止活动远比从头开始一个活动便宜。因为我们已经将所有对象加载到内存中,只需要把它加载到前台。

停止活动,可以在任何时候从内存中删除。

破坏状态

破坏活动不再是在内存中。活动管理器决定不再需要这个活动,并删除它。活动被摧毁之前,它可以执行某些操作,如保存任何未保存的信息。然而,没有保证你的活动将会被摧毁之前停止。暂停活动有可能被摧毁。出于这个原因,最好是做重要的工作,如未保存的数据保存,途中暂停状态而不是破坏状态。

意图

意图之间发送的消息的主要构建块。他们触发一个活动启动,告诉一个服务启动或停止,或仅仅是广播。意图是异步的,这意味着发送的代码不需要等待他们完成。

一个可以显式或隐式意图。在一个明确的意图,发送者清楚地说明了哪些特定的组件应该在接收端。在一个隐式意图,发送方指定类型的接收机。例如,你的活动可以发送一个意图说它仅仅是想要有人打开一个网页。在这种情况下,任何应用程序,能够打开一个网页可以“竞争”来完成这个动作。

当你有竞争的应用程序,系统会问你你想使用哪一个来完成一个给定的行动。您还可以将应用程序设置为默认值。这种机制非常类似于你的桌面环境,例如,当您下载Firefox和Chrome来代替默认的Internet Explorer或Safari网络浏览器。

这种类型的信息允许用户系统上的任何应用程序替换为一个自定义。例如,您可能想下载不同的短信应用程序或其他浏览器取代你现有的。图4 - 2显示意图可在同一应用程序或另一个应用程序用于各种活动之间的“跳转”。

服务

服务在后台运行,没有任何用户界面组件。他们可以执行相同的操作活动,但没有任何用户界面。服务是有用的行动,我们想执行一段时间,无论在屏幕上是什么。例如,您可能想要你的音乐播放器播放音乐,即使你是烙在其他应用程序之间

服务相比活动有一个更简单的生命周期(见图4 - 3)。你要么开始或停止服务。同时,服务生命周期或多或少控制的开发人员,而不是那么多的系统。因此,我们作为开发人员必须注意 运行我们的服务,所以他们不消耗不必要的共享资源,如CPU和电池。

内容提供商

内容提供者接口的应用程序之间共享数据。Android在默认情况下,每个应用程序都运行在自己的沙盒,这样所有的数据属于应用程序是完全孤立的从系统上的其他应用程序。虽然少量的数据可以通过应用程序之间通过意图、内容提供商是更好的适合分享可能是大型数据集之间的持久数据。因此,内容提供者API很好地坚持CRUD原则。图4 - 4展示了内容提供商的CRUD接口如何穿过应用程序边界,并允许其他应用程序连接到共享数据。

安卓系统一直使用这种机制,例如,联系供应商是一个内容提供者,使所有用户接触数据到各种应用程序。设置提供程序向各种应用程序供了系统设置。包括内置的应用程序,媒体商店在不同的应用程序负责存储和共享各种媒体,如:图片和音乐。图4——5演示了联系人应用程如何使用接触供应商,一个完全独立的应用程序对用户的联系人检索数据。联系人应用程序本身没有任何联系人数据,和接触供应商没有任何用户界面。

这种分离的数据存储和实际的应用程序用户界面提供了更大的灵活性来混搭系统的各个部分,例如,一个用户可以安装另一个地址簿应用程序使用相同的数据作为默认联系人应用程序。或者可以在主屏幕上安装小部件允许容易改变系统设置,如打开或关闭WiFi、蓝牙、GPS功能许多手机制造商利用内容提供商添加自己的应用程序,标准Android提高用户的整体体验,比如,HTC Sense

内容提供商是一个相对简单的接口,标准插入()、更新()删除()和查询()方法。 这些方法看起来很像标准数据库的方法,所以 它实现一个内容提供者作为一个代理到数据库相对容易。话虽如此,相对于你自己写的你更有可能使用内容提供商。

广播接收器

广播接收器是Andriod的一个系统范围的发布/或订阅机制的实现 ,更准确的说,一个观察者模式。接收机只是休眠的代码被激活后它订阅事件发生。

系统本身报道事件,例如,当一个短信到达时,一个电话进来,电池电量低或系统被启动,所有这些事件都报道和任意数量的接收器可以触发。

在我们的Twitter应用程序示例中,一旦系统启动我们要开始更新服务,要做到这一点,我们可以订阅广播告诉我们系统已启动完成,

你也可以发送自己的广播从一个应用程序到另 一个,或者一个完全不同的应用程序。

广播接收器本身没有任何可视化表示,他们也积极在内存中运行,但当触发时,他们 可以执行一些代码,比如开始一个活动,一个服务或其他活动。

应用程序上下文

到目前为止,您已看到活动,服务内容提供商,广播接收器,他们一起构成了一个应用程序,另一种说法是他们住在同一个应用程序上下文。

应用程序上下文是指应用程序环境和运行过程中所有的组件,它允许应用程序共享构件之间的数据和资源。

启动一个应用程序上下文时只要启动此应用程序的第一个组件,无论该组件是一个活动、服务或者其它东西。

主要您的应用程序还在运行应用程序上下文就一直存在着,因此,它是独立的生命周期的活动。

总结