ApplicationFundamentals-应用程序基础Android应用程序使用java作为开发语言。利用AndroidSDK提供的工具,可以将应用程序所需的数据和资源文件打包成一个android包文件,以.apk为扩展名。所有代码都在一个.apk文件中,作为应用程序,此文件通常安装在Android设备上。一旦安装在设备上,每个应用程序都位于自己的安全沙箱中。Android系统是一个多用户的Linux系统,其中每个应用程序都是不同的用户。默认情况下,系统会为每个应用程序分配一个独立的Linux用户ID(这个ID仅供系统使用,对应用程序是不可知的),系统会为一个应用程序中的所有文件设置权限,因此只有应用程序分配了该用户ID可以访问它们。每个进程都有自己的虚拟机,因此一个应用程序代码的执行与其他应用程序代码的运行是隔离的。默认情况下,每个应用程序都在其自己的虚拟机中运行。在Linux进程中。Android在应用程序中的任意代码开始执行时启动一个进程,并在不再需要该进程且其他应用程序需要系统资源时关闭该进程。这样,Android系统就实现了最小权限原则。默认情况下,每个应用程序只访问需要工作的组件,而不会做其他事情。这创建了一个非常安全的环境,应用程序无法访问它们未被授权访问的系统的其他部分。但是,应用程序可以通过多种方式与其他应用程序共享数据和访问系统服务:可以安排两个应用程序共享一个linux用户ID,在这种情况下,它们可以访问彼此的数据。为了节省系统资源,具有相同用户ID的应用程序也可能被安排在同一个Linux进程中运行并共享同一个VM(应用程序必须签署相同的证书)。所有应用程序都可以请求访问硬件数据的权限,例如用户联系人、短信和可挂载存储设备(SD卡)、相机、蓝牙等,并且必须在用户安装它们时授予所有应用程序权限。以上描述了与应用程序如何存在于系统中相关的基本概念。本文档的其余部分将向您介绍以下内容:在清单中定义您的应用程序中的核心框架组件,并为您的应用程序声明组件和设备特性。独立于应用程序代码请求资源允许您的应用程序极大地优化其在各种配置设备上的性能。ApplicationComponents-ApplicationComponents应用组件是构建Android应用的关键和基石。每个组件都是一个独特的入口点,系统可以从中进入您的应用程序。并非每个组件都是用户的实际入口点,但它们之间存在一些依赖关系。但是每个存在的组件都有自己的入口点并扮演着特定的角色——每个组件都是独特的构建块,可帮助您定义应用程序的整体行为。有四种不同类型的应用程序组件,每一种都有不同的用途,并且有不同的生命周期,定义了如何创建和销毁它。下面是四个应用程序组件:活动屏幕上显示用户界面的活动。例如,电子邮件应用程序可能有一个显示新电子邮件列表的活动。另一个活动是用来写的还有一个活动是用来读邮件的。尽管这些活动在电子邮件应用程序中协同工作以形成完整的用户体验,但每个部分都是相互独立的。正因为如此,不同的应用程序可以启动这些活动。任何一个(例如电子邮件应用程序允许的)。例如,相机应用程序可以在电子邮件应用程序中启动一个活动来编写新电子邮件,从而允许用户共享照片。活动作为Activity的子类实现,在活动开发指南中,您可以使用服务了解更多信息。服务是长期在后台运行,执行操作,甚至可以为远程进程工作的组件。服务不提供用户界面。例如,当用户在其他应用程序中时,某个服务可能会在后台播放音乐,或者在后台获取数据,这些都不会影响用户与其他活动的交互。其他组件,比如一个activity,可以启动一个service让其运行或者绑定到这个activity上与之交互。服务作为服务子类实现。您可以在服务开发指南中了解更多信息。使用内容提供者Content提供内容提供者来管理共享应用程序数据集。您可以将数据存储在文件系统、SQLite数据库、在线或您的应用程序可以访问的持久存储中。通过内容提供者,其他应用程序可以查询甚至修改数据(如果内容提供者允许的话)。例如Android系统提供了一个contentprovider来管理用户通讯录信息。因此,任何具有适当权限的应用程序都可以查询内容提供者的部分(例如ContactsContract.Data)来读写关于一个人的信息。内容提及提供程序对于读取和写入您的应用程序私有的非共享数据也很有用,例如记事本示例应用程序,它使用内容提供程序来存储笔记。内容提供者被认为是ContentProvider的子类实现,必须实现一组标准的API,以便其他应用程序可以执行交换操作。更多信息请参阅内容提供者开发指南。广播接收器广播接收器是对系统范围广播公告(通知)的响应。许多广播消息源自系统,例如屏幕关闭、电池电量低或已捕获图片的通知。应用程序还可以发起广播,例如,让其他应用程序知道一些数据已经下载到设备,它们可以使用了。尽管广播接收器无法显示用户界面,但它们可以创建一个状态通知器,在广播事件发生时提醒用户。但在更多情况下,广播接收器只是另一个组件,它希望为某个事件做最少的“网关”(途径)。例如,它可能会启动一个服务来对某个事件执行一些工作。广播接收器是作为BroadcastReceiver子类实现的。每个广播接收器都有从Intent对象派生的。有关详细信息,请参阅BroadcastReceiver类。任何应用程序都可以启动另一个应用程序组件。这是Android系统设计独有的一个方面。例如,您想用设备的相机拍照。其他应用程序已经启用了此功能,您的应用程序无需自己开发相机活动即可使用它。您不需要合并(包含)甚至链接相机应用程序中的代码;相反,只需在应用程序中启动相机Activity,只需拍照即可。照片完成后,甚至可以将照片返回到您的应用程序,以便您可以使用它。对于用户来说,相机就像是你应用程序的一部分。当系统启动一个组件时,它会启动该应用程序的进程(如果该应用程序未运行),并实例化该组件所需的类。例如,如果您的应用程序启动相机应用程序的一个活动来拍照。此活动将在属于相机应用程序的进程中运行,而不是在您的应用程序的进程中运行。因此,与大多数其他系统应用程序不同,Android应用程序没有单一的入口点(例如,没有main()函数)。因为系统上运行的每个应用程序都在一个单独的进程中,具有文件权限,这就限制了对其他应用程序的访问,你的应用程序不能直接访问其他应用程序。但是,安卓系统也可以激活其他应用程序的组件。您必须向系统传递一条消息,指定您要启动的组件,然后系统会为您激活该组件。激活组件-ActivatingComponents4组件这些组件中的三个——活动、服务和广播接收器——由称为意图的异步消息激活。在运行时,Intents将某些组件绑定到其他组件,而不管该组件是属于您的应用程序还是另一个应用程序(您可以将它们视为一条消息,用于请求另一个组件的动作)。Intent是由Intent创建的对象。该对象定义了特定组件的激活或对于特定组件类型的消息,意图可以是显式的或隐式的。对于活动和服务,意图定义要执行的操作(例如:“查看”或“发送”某物),并以URI格式指定要使用的数据(其中一些需要其他组件知道)开始)。例如,一个Intent可能会向Activity发送请求以显示图像或打开网页。在某些情况下,您启动Activity以接收结果。在这种情况下,活动将在Intent中返回一个结果。(例如,您可以指示一个意图让用户获取一个人的联系信息并将其返回给您。返回的意图将包含一个指向所选联系人的URI。)对于广播接收器,意图只是将公告定义为播送。(例如,声明设备电池电量低的广播只包含一个动作字符串,表示“电池电量低”)。它是另一个组件,内容提供者,不是由意图激活的。此外,它由内容解析器(ContentResolver)请求的目标激活。内容解析器处理与内容提供者的所有直接交换。因此组件不需要与提供者进行交换,而是调用ContentResolver对象方法。(这句话不太好理解)出于安全考虑,在组件请求信息和内容提供者之间有一个抽象层。以下是激活各种类型组件的几种方法:您可以通过将(或一些新的)Intent参数传递给startActivity()或startActivityForResult()(当您希望活动返回参数时)函数来启动活动().您可以将Intent传递给startService()方法(或向正在运行的服务提供新命令),或者您可以将Intent传递给bindService()方法以绑定到服务。您可以使用sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()三种方法来广播一个意图。您可以通过调用ContentResolver上的query()方法来查询内容提供者。有关使用意图的更多信息,请参阅意图和意图过滤器文档。在下面的文档中,也有一些关于激活某个组件Activity、Services、BroadcastReceiver和ContentProviders的信息。Manifest文件-TheManifestFile在Android系统启动一个应用程序组件之前,系统必须读取AndroidManifest.xml文件才能知道组件的存在。您的应用程序必须在此文件中声明其所有组件,并且它必须位于应用程序项目的根目录中。这个manifest文件除了声明组件之外,还处理了很多其他的事情,比如:指定应用请求其他权限,比如访问网络或者访问用户通讯录,声明应用需要的最低APILevel,使用哪个API通过应用程序,声明应用程序请求和使用的软件和硬件功能,例如相机,蓝牙服务,或多点触控触摸屏应用程序需要链接的API库,例如谷歌地图库等。声明组件-声明组件清单文件的主要任务是告诉系统,应用程序的组件,例如,清单可以声明这样的活动:
