安卓应用开发基础:android Dev Guide的Application Fundamentals中文翻译

  注:我最近加入了Android中文翻译组,旨在为大家带来更好的翻译。该章节已完成初稿并提交审核校验。以下内容为不完整版本,已不推荐阅读。最终版之后会由Android中文小组发布,请大家见谅。

安卓应用基础

第一次翻译,翻译的不对或是不准确的地方还请大家指正,英文原文地址:http://developer.android.com/guide/topics/fundamentals.html

Android应用是用Java编程语言写的。Android SDK工具将代码同其他的数据、资源文件一起编译成一个后缀为.apk的压缩文件(即Android package)。一个apk文件就是一个Android应用,使用Android的设备就是用apk文件来安装Android应用的。

一旦在设备上安装,每个Android应用都运行在自己的安全“沙盒”中:

  ●  Android操作系统是一个多用户的Linux系统,每个应用都是一个不同的用户。(PS:因为没学过Linux,这里不太理解)

  ●  默认情况下,系统将为每个应用分配一个独一无二的Linux用户ID(这个ID仅被系统使用,应用本身是不知道它的)。应用中的所有文件访问许可都被系统设置了此 ID,因此,只有被分配了该用户ID的应用可以访问这些文件。

  ●  每个进程都有自己的虚拟机,所以一个应用的代码执行是和别的应用分割开来的。

  ●  默认情况下,每个应用都运行在自己的Linux进程中。当应用的某个或某些组件需要执行时,Android将启动此应用的进程;当应用不再需要执行或者系统必须为了其 他应用恢复内存时,进程被停止。

Android系统通过这种方式实现最低权限原则(the principle of least privilege).也就是说,每个应用在只需要完成自己的功能而不需要其他服务的时候,默认只对自己的组件有访问权限。这创造了一个非常安全的环境,因为应用在没有获许的情况下是不能访问系统的其他部分的。

然而,应用也是有办法和别的应用共享数据甚至访问系统服务的:

  ●  使两个应用共享同一个Linux用户ID是有可能的,这样的话他们就能互相访问彼此的文件了。为了节省系统资源,使用同一个ID的应用也能运行在一个进程中并且共 享虚拟机(这些应用必须使用相同的证书)。

  ●  应用可以申请获取设备数据(如用户的联系人、短消息、SD卡、摄像头、蓝牙等)的许可。所有的应用许可都必须在应用安装的时候获得用户的准许。

上面介绍了关于Android应用程序在系统中执行的基础知识。这篇文档的剩余部分将向您介绍:

  ●  定义应用的核心框架组件。

  ●  manifest文件,该文件为应用声明组件和需要的设备特性。

  ●  与应用代码分离的资源,它能让你的应用通过各种设备配置优雅的优化其行为。

应用组件

应用组件是Android应用所必需的构建块。每个组件都是系统进入你应用的一个不同的入口。尽管不是所有的组件都是用户的实际入口点,它们彼此间还存在着一些相互依赖,但是每个组件都拥有自己的实体,并且扮演着独特的角色——每一个都是定义你应用总体行为的独一无二的构建块。

应用组件有4种不同的类型。每个类型都有不同的设计目标,并且定义了如何创建和销毁的不同生命周期。

下面是这4种应用组件:

Activities(活动)

activity代表有用户界面的一个单一的屏幕。比如:一个email应用可能有一个activity来显示新邮件的列表,另一个activity来撰写电子邮件,另一个activity来阅读邮件。虽然在一个email应用中,这些activity一起形成了一个有凝聚力的用户体验(cohesive user experience,翻译得很别扭),但是每个activity都是独立于其他activity的。举个例子,一个摄像应用可以启动email应用中撰写邮件的activity来分享一副图片。

通过继承Activity类来实现一个activity,阅读activities开发指导你能了解到更多。

Services(服务)

service是在后台运行长时间操作或者执行远程进程工作组件。service不提供用户界面。比如,一个service可以在用户执行另一个应用时在后台播放音乐,或者不阻塞用户与activity交互,通过网络抓取数据。另一个组件,比如activity,能够通过开启、运行或绑定service来与之交互。

一个service是Service类的子类,阅读Services开发指导你能了解到更多。

Content providers(内容提供者)

Content providers管理应用的共享数据。你能将数据存储在文件系统、SQLite数据库、web或者任何你的应用能访问到的永久存储地点。通过content provider,其他应用能查询或修改这些数据(如果content provider允许)。比如,Android系统提供了管理用户联系人信息的content provider。因此,得到许可的任何应用都能查询content provider(比如ContactsContract.Data)的一部分来读写某一联系人的信息。

Content providers对应用的私有和不共享数据的读写也是同样有帮助的。比如,Note Pad示例使用了一个content provider来保存笔记。

一个content provider通过继承ContentProvider抽象类并且实现允许其他应用执行事务的一组标准API来实现。想要更多信息,见Content Providers的开发指导。

Broadcast receivers(广播接受者)

一个broadcast receiver是响应全系统广播通知的一个组件。许多广播由系统发起——比如,宣布屏幕已关闭,电量不足,或者照片被捕获的广播通知。应用也能够初始化广播——比如,一个告诉其他应用数据已经被下载到设备上,可以被他们使用的广播。尽管broadcast receivers并不显示用户界面,它们可能创建一个状态栏通知来告知用户广播何时发生。但是,更常见的情况是,broadcast receiver只作为其他组件的“出入口”(gateway),其本身做的工作非常少。举个例子,它可能初始化一个服务来根据具体事件执行一些工作。

一个broadcast receiver通过继承BroadcastReceiver类来实现,每个broadcast被作为一个Intent对象发布。想要更多的信息,见BroadcastReceiver类。

  

Android系统设计的一个独特之处在于,任何一个应用都能启动其他应用的组件。比如,如果你想要用户使用摄像头捕捉一张照片,这个功能另一个应用能实现,你的应用就可以使用它,而不必由你自己再开发一个捕捉照片的activity。你不必协同甚至连上照相应用的代码。取而代之,你只需简单地启动照相应用捕捉照片的activity就行了。当调用完成时,照片被传入你的应用,然后你就可以用它了。对用户来说,照相机好像就是你应用的一部分。

当系统启动你的组件,它就会启动这个应用的进程(如果不在运行的话)并且初始化这个组件需要的类。比如,如果你的应用启动了照相应用拍照的activity,这个activity就在属于照相应用的进程中运行,而不在你应用的进程中。因此,与大多数其他系统不同,Android应用没有一个单一的入口(比如说,没有main()函数)。

由于系统将应用运行在一个有文件权限的独立进程中,限制了对其他应用的访问,因此你的应用不能直接激活其他应用的组件。然而,Android系统是可以的。因此,为了激活其他应用的组件,你必须向系统发消息说你意图(intent)启动一个特殊的组件。然后系统为你激活该组件。

组件激活

上述四种组件类型中,activities、services和broadcast receivers这三种是被一个叫做intent的异步消息激活的。Intents在运行时将独立的组件联系起来(你可以把它们想象成向其他组件请求动作的消息),不管这个组件属于你的应用还是别的。

一个intent被创建为一个Intent对象,它定义了激活指定组件或组件类型的消息——intent可以是显示的,也可以是隐式的。

针对activities和services,intent定义了要执行的动作(比如,要“看”或者“发送”一些东西)并且可能指定要操作的数据URI(除了其他事项外,将要执行的组件可能需要知道它)。例如,一个intent可能向一个activity传达消息说要显示一幅图片或者打开一个网页。有些情况下,你能启动一个activity来接受结果,即activity也能通过intent来返回结果(比如,你发出一个intent让用户选择一个联系人并将他返回给你——这个返回的intent包括了指向所选联系人的URI)。

针对broadcast receivers,intent简单定义了要广播的公告(比如,一个指示设备电量不足的广播只包括了一个已知动作的字符串,暗示"电量不足")。

剩下一种组件类型,content provider,不被intent所激活。它被一个来自ContentResolver的目标请求所激活。内容解释器(content resolver)直接处理content provider的所有直接事务,因此执行这些事务的组件不需要和content provider打交道,取而代之的是调用ContentResolver的方法。这留下了content provider和组件请求信息之间的抽象层(出于安全)。

以下这些分离的方法用于激活每一种组件类型:

  ●  你能通过向startActivity()或者startActivityForResult()(当你想要让activity返回结果)方法传递一个Intent来开始一个activity(或者让它做一些新的事)。

  ●  你能通过向startService()方法传递一个Intent来开始一个service(或给一个正在执行的service新的指令)。或者你能通过向bindService()方法传递一个Intent来 绑定一个service。

  ●  你能通过向sendBroadcast()sendOrderedBroadcast()或者sendStickyBroadcast()这样的方法传递一个Intent来初始化一个broadcast。

  ●  你能通过调用ContentResolverquery()方法执行一次查询。

要得到更多关于使用intent的信息,见Intents and Intent Filters文档。关于激活指定组件的更多信息也请参考下列文档:ActivitiesServicesBroadcastReceiverContent Providers

  

posted @ 2011-07-17 01:00 CodingMyWorld 阅读(...) 评论(...) 编辑 收藏