思想永无止境的专栏

文档目录1 应用组件1.1 Activating组件2 清单文件3 应用资源

Android 应用是基于Java程序语言的。Android SDK 工具编译你的代码以及任何数据和资源文件到一个APK(全称“anAndroid package”),那是一个.apk后缀的归档文件。一个APK 文件包含Android应用所需的所有内容,apk文件是Android设备的应用程序的安装文件。

一旦安装在设备上,每个Android应用程序都存在于它自己的安全沙箱:

这样,Android系统实现了最细粒度的权限原则。在默认情况下,每个应用程序只能使用自己能访问的组件来做它需要做的工作。这将创建一个非常安全的环境,应用程序不能访问它没有权限的系统部分。

然而,应用程序与其他应用程序之间以及一个应用程序与系统服务之间,可以有这样的数据共享方式:

让两个应用程序共享相同的Linux用户ID,这是可能的,在这种情况下,他们能够访问彼此的文件。为了节约系统资源,具有相同用户ID的应用程序也可以运行在相同的Linux进程共享相同的虚拟机(应用程序也必须使用相同的证书签名)。一个应用程序可以请求对系统数据的访问权限,如用户的联系人,短信,可插拔的存储设备(SD卡),摄像头,蓝牙,等等。所有的应用程序权限必须由用户在安装时授予,也就是在清单文件AndroidManifest.xml上要列举该应用需要哪些权限。

本文档主要介绍一个Android应用程序的基础知识。文档其他部分会介绍:

1 应用组件

应用程序组件是一个Android应用程序的基本构造块。每个组件都是一个不同的点,通过这个点可以从系统进入你的应用程序。不是所有的组件都是一个实际的切入点,但每一个存在的实体,扮演着特定的角色,每一个都是独特的构建块,能让你规定你的应用程序的整体行为。

有四种不同类型的应用程序组件。每个类型都有不同的目的,有不同的生命周期,有不同的创建和销毁规则。

这里有四种类型的应用程序组件:

Activities一个Activity代表了一个用户界面。例如,一个电子邮件应用程序可能有一个Activity显示新邮件列表,一个Activity撰写邮件,一个Activity来读取邮件。虽然Activity一起形成了电子邮件应用程序,一个完整的用户界面,但每一个Activity都是独立的。因此,不同的应用程序可以启动这些Activity的任何一个(如果邮件应用程序允许的话)。例如,一个摄像头的应用程序为了让用户分享图片,可以调用电子邮件应用程序中的编写新邮件的Activity。

每一个Activity都是实现Activity的子类,你可以学习更多关于Activities的开发指南。

ServicesService组件运行在后台执行长时间运行的操作或执行远程操作。Service不提供用户界面。例如,一个Service可以在后台播放音乐,当用户切换不同的应用程序时,也可以从网络上获取数据,而不阻塞用户界面和活动。另一个组件,如Activity,可以启动Service,并让它运行或绑定到它,与它进行交互。

每一个Service都是实现Service的子类,你可以学习更多关于Services的开发指南。

Content ProvidersContentProvider管理应用程序的共享数据集。你可以将数据存储在文件系统中,一个SQLite数据库上,互联网上,或任何其他应用程序可以访问持久存储的位置。通过ContentProvider,其他应用程序可以查询或修改数据(如果ContentProvider允许)。例如,Android系统提供一个ContentProvider管理用户的联系人信息。因此,任何拥有适当权限的应用程序可以查询ContentProvider的某一部分(如ContactsContract.Data)来读取和写入一个特定的联系人信息。

ContentProvider也可用于读取和写入你自己应用程序私有而不是共享的数据。例如,记事本示例应用程序使用ContentProvider保存笔记。

每一个ContentProvider都是实现ContentProvider的子类,你可以学习更多关于Content Providers的开发指南。

Broadcast ReceiversBroadcastReceivers是一个响应系统广播通告的组件。许多广播起源于系统,例如,广播通知屏幕已经关闭,电池低,或图片拍摄。应用程序也可以进行广播,比如,让其他应用程序知道某些数据已经下载到设备,其他应用可以开始使用。虽然BroadcastReceivers不显示用户界面,但他们可以创建状态栏通知用来提醒用户一个广播事件的发生。更常见的是,BroadcastReceivers是一个“入口式”的进入其他组件,只做一点点工作。例如,它可能会启动一个服务来执行基于事件的一些工作。

每一个BroadcastReceivers都是实现BroadcastReceiver的子类,每个广播作为一个Intent对象传递的实现。更多信息参见BroadcastReceiver类。

Android系统的一个独特的方面是任何应用程序可以启动另一个应用程序的组件。例如,如果你想让用户用照相机拍一张照片,可能有另一个应用程序需要使用它,代替应用程序自己开发一个Activity用来拍摄照片。你不需要包含或者连接到相机的应用程序代码。相反,你可以简单的启动一个Activity,在相机拍摄照片的活动完成时可以获得照片,照片会返回到你的应用程序,所以你可以使用它。对用户来说,相机就好像是你的应用程序的一部分。

当系统启动一个组件,它会首先启动应用进程(如果它不是已经在运行)和实例化该组件所需要的类。例如,如果你的应用程序启动相机应用程序拍摄照片的Activity,这些Activity是属于摄像头应用程序的程序,而不是在你的应用程序的程序。因此,不像很多其他系统上的应用程序,Android应用程序没有一个单一的入口点(没有main()函数)。

因为系统运行每个应用程序在一个单独的进程,并限制其他应用程序访问该应用程序的文件,你的应用程序不能直接激活另一个应用程序的组件。不过在Android系统中,如果你的应用程序要激活另一个应用程序的组件,你必须向系统发送一条消息,指定你的Intent来启动某个组件,然后系统为你激活那个应用程序的组件。

1.1 Activating 组件

三四种类型的组件如Activity,Service,和BroadcastReceivers是由一个叫做Intent的异步消息激活。在运行时,Intent能把相互独立的组件联结在一起(你可以把它们作为使者,请求一个动作从其他组件),不用管这个被联结的组件是属于你的应用程序还是另一个应用程序。

一个Intent是一个创建了的Intent对象,它定义了一个消息来启动某个组件,Intent启动组件的方式可以是显式或隐式的。

接着我们去了遇龙河,那里的水清澈见底,我把脚伸进水里,

思想永无止境的专栏

相关文章:

你感兴趣的文章:

标签云: