您的位置:首页 > 移动开发

API Guide:绪论-App基础知识

2017-04-17 20:51 260 查看
注意:本人非专业翻译人员,编写此博客只是为了自学使用,如有疑问,请参考官方文档。

Android应用程序是用Java编程语言编写的。Android SDK工具将您的代码与数据和资源文件一起编译成APK——一个Android软件包,它是一个.apk后缀的归档文件。一个APK文件包含Android应用程序的所有内容,它是Android设备用于安装该应用程序的文件。

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

I、Android操作系统是一个多用户Linux系统,其中每个应用程序是不同的用户。

II、默认情况下,系统为每个应用程序分配一个唯一的Linux用户ID(该ID仅由系统使用,对应用程序而言是未知的)。该系统为应用程序中的所有文件设置权限,以便只有分配给该应用程序的用户ID才能访问它们。

III、每个进程都有自己的虚拟机(VM),所以应用程序的代码与其他应用程序隔离运行。

IV、默认情况下,每个应用程序都在自己的Linux进程中运行。当任何应用程序的组件需要执行时,Android会启动该进程,然后在不再需要时关闭该进程,或者系统必须为其他应用程序恢复内存。

这样一来,Android系统就实现了最低权限的原则。也就是说,默认情况下,每个应用程序只能访问它所需的组件来完成其工作,而不再访问其他组件。
这创建了一个非常安全的环境,其中应用程序无法访问未向其授予权限的系统的部分。

但是,有一些应用程序之间共享数据以及访问系统服务的方法:

I、安排两个应用程序共享相同的Linux用户ID是可行的,在这种情况下,他们可以访问彼此的文件。为了节省系统资源,具有相同用户ID的应用程序也可以安排在同一个Linux进程中运行并共享同一个虚拟机(应用程序也必须使用相同的证书进行签名)。

II、应用程序可以请求访问设备数据的权限,例如用户的联系人,SMS消息,可挂载存储设备(SD卡),摄像头,蓝牙等。用户必须明确授予这些权限。
有关详细信息,请参阅使用系统权限一节。

以上涵盖了关于Android应用程序如何存在在系统中的基础知识。本文档的其余部分向您介绍:

I、定义应用程序的核心框架组件。

II、为你的app声明组件以及所需设备功能的清单文件。

III、与应用程序代码分离的资源,并允许您的应用程序优化各种设备配置的行为。

一、App组件

应用程序组件是Android应用程序的基本构件。每个组件都是一个系统能进入到你app里面的不同点。应用程序组件是Android应用程序的基本构件。每个组件是系统可以通过该点输入您的应用程序的不同点。
并不是所有组件都是用户的实际入口点,有些依赖于彼此,但每个组件都作为自己的实体存在并发挥特定的作用 - 每个组件都是一个独特的构建块,可帮助您定义应用程序的整体行为。

有四种不同类型的应用程序组件。每种类型都具有不同的用途,并且具有明确定义组件的创建和销毁的生命周期。

以下是app组件的四种类型:

活动

活动表示一个用户界面的单个屏幕。例如,电子邮件应用可能有一个活动显示新的电子邮件列表,一个编写电子邮件的活动,以及另一个阅读电子邮件的活动。虽然这些活动在一起形成了电子邮件应用程序中的一致性用户体验,但每个活动都独立于其他应用程序。因此,一个不同的应用程序可以启动这些活动中的任何一个(如果电子邮件应用程序允许的话)。例如,相机应用程序可以在编写新邮件的电子邮件应用程序中启动活动,以便用户共享图片。

活动是作为Activity的子类实现的,您可以在Activities开发者指南中了解更多信息。

服务

服务是在后台运行以执行长时间运行的操作或为远程进程执行工作的组件。服务不提供用户界面。
例如,当用户处于不同的应用程序时,服务可能会在后台播放音乐,或者可能通过网络获取数据而不会阻止用户与活动的交互。另一个组件(如活动)可以启动服务,让它运行或与之绑定,以便与之进行交互。

一个服务作为Service的子类实现,您可以在服务开发人员指南中了解更多信息。

内容提供器

内容提供管理一组共享的应用程序数据。您可以将数据存储在文件系统,SQLite数据库,网络上或您的应用程序可以访问的任何其他持久存储位置。
通过内容提供,其他应用程序可以查询甚至修改数据(如果内容提供者允许的话)。例如,Android系统提供管理用户联系信息的内容提供。
因此,任何具有适当权限的应用程序都可以查询内容提供商的一部分(例如ContactsContract.Data)来读取和写入有关特定人员的信息。

内容提供可以读取和写入您的应用程序私有的数据。例如,Note
Pad示例应用程序使用内容提供来保存笔记。

内容提供被实现为ContentProvider的子类,并且必须实现一组标准的API,以使其他应用程序能够执行事务。有关更多信息,请参阅内容提供商开发人员指南。

广播接收器

广播接收器是响应于全系统广播通知的组件。许多广播来源于系统
,例如,广播宣布屏幕已经关闭,电池电量不足或被捕获。 应用程序还可以启动广播 ,例如,让其他应用程序知道某些数据已下载到设备,并可供他们使用。虽然广播接收器不显示用户界面,但是它们可以创建状态栏通知,以在广播事件发生时提醒用户。
然而,更常见的是,广播接收机仅仅是其他组件的“网关”,并且旨在进行非常少量的工作。例如,它可能会启动服务以根据事件执行一些工作。

广播接收器被实现为BroadcastReceiver的子类,并且每个广播作为Intent对象传送。有关更多信息,请参阅BroadcastReceiver类。

Android系统设计的独特之处在于,任何应用都可以启动其他应用的组件。例如,如果您希望用户使用设备摄像头捕获照片,则可能还有另一个(已经存在的)应用程序可以被使用,而不是开发自己捕获照片的活动。
您不需要整合或甚至链接到相机应用程序的代码。 相反,您可以在拍摄照片的相机应用程序中简单地启动该活动。
完成后,照片甚至可以返回到您的应用程序,以便您可以使用它。对于用户来说,好像相机实际上是您的应用程序的一部分。

当系统启动组件时,它会启动该应用程序的进程(如果尚未运行)并实例化组件所需的类。例如,如果您的应用程序在相机应用程序中启动捕获照片的活动,该活动将在属于相机应用程序的过程中运行,而不是在应用程序的进程中。
因此,与大多数其他系统上的应用程序不同,Android应用程序没有单个进入点(例如,没有main()功能)。

由于系统在单独的进程中运行每个应用程序,而且具有限制访问其他应用程序的文件权限,因此您的应用程序无法从其他应用程序直接激活组件。然而,Android系统可以。
因此,要激活另一个应用程序中的组件,您必须向系统发送一条消息,指定您启动特定组件的意图。系统然后为您激活组件。

二、激活组件

四种组件类型中的三种
- 活动,服务和广播接收器 - 被称为意图的异步消息激活。 意图在运行时将各个组件彼此绑定(您可以将它们视为请求其他组件的操作的信使),无论组件是否属于您的应用程序或其他组件。

使用Intent对象创建意图,该对象定义了一个消息来激活特定组件或特定类型的组件
- 意图可以分别是显式或隐式。

对于活动和服务,意图定义了要执行的操作(例如,“查看”或“发送”某些内容),并且可以指定要作用的数据的URI(除了其他方面,正在启动的组件可能需要知道)。
例如,意图可能传达对活动的请求以显示图像或打开网页。 在某些情况下,您可以开始一个活动来接收结果,在这种情况下,活动还会将结果返回到Intent中(例如,您可以发出让用户选择个人联系人并将其返回给您的意图- 返回意图包括指向所选联系人的URI)。

对于广播接收机,意图简单地定义正在广播的通告(例如,指示设备电池低的广播仅包括指示“电池电量低”的已知动作串)。

其他组件类型,内容提供程序未被意图激活。相反,当ContentResolver的请求定位时,它被激活。
内容解析器处理与内容提供者的所有直接事务,以便组件执行事务的组件不需要提供程序,取而代之的是调用ContentResolver对象上的方法。这在内容提供者和请求信息的组件(为了安全性)之间留下了一层抽象。

有单独的方法激活每种类型的组件:

I、通过将Intent传递给startActivity()或startActivityForResult()(当您希望活动返回结果时),您可以启动一个活动(或给它一些新功能)。

II、通过将Intent传递给startService(),您可以启动服务(或给正在进行的服务的新指令)。或者您可以通过将Intent传递给bindService()来绑定到该服务。

III、您可以通过将Intent传递给sendBroadcast(),sendOrderedBroadcast()或sendStickyBroadcast()等方法来发起广播。

IV、您可以通过调用ContentResolver上的query()来向内容提供者执行查询。

有关使用意图的更多信息,请参阅意向和意图过滤器文档。以下文档还提供了有关激活特定组件的更多信息:活动,服务,BroadcastReceiver和内容提供器。

三、清单文件

在Android系统启动应用程序组件之前,系统必须通过阅读应用程序的AndroidManifest.xml文件(清单文件)知道该组件的存在。您的应用必须在此文件中声明其所有组件,该组件必须位于应用程序项目目录的根目录。

清单除了声明应用程序的组件之外还会执行一些操作,例如:

I、识别应用程序需要的任何用户权限,例如Internet访问或对用户联系人的读取权限。

II、根据应用程序使用的API,声明应用程序所要求的最低API级别。

III、声明应用程序使用或要求的硬件和软件功能,如相机,蓝牙服务或多点触控屏幕。

IV、应用程序需要与API框架(除Android框架API之外)(如Google
Maps库)进行链接。

四、声明组件

清单的主要任务是通知系统应用程序的组件。例如,清单文件可以声明如下的活动:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>

在<application>元素中,android:icon属性指向用于标识应用程序的图标的资源。

在<activity>元素中,android:name属性指定Activity子类的完全限定类名,而android:label属性指定用作该活动的用户可见标签的字符串。

您必须以这种方式声明所有应用程序组件:

I、活动:<activity>元素

II、服务:<service>元素

III、广播接收器:<receiver>元素

IV、内容提供器:<provider>元素

在源中包含但不在清单中声明的活动,服务和内容提供者对于系统是不可见的,因此永远不会运行。但是,广播接收器可以在清单中声明,也可以在代码(如BroadcastReceiver对象)中动态创建,并通过调用registerReceiver()向系统注册。

有关如何构建应用程序的清单文件的更多信息,请参阅AndroidManifest.xml文件文档。

五、声明组件功能

如上所述,在激活组件中,您可以使用Intent启动活动,服务和广播接收器。这些您可以通过在目标中明确命名目标组件(使用组件类名称)来实现。
然而,意图的真正意义在于隐含意图的概念。 隐含的意图只是描述要执行的操作的类型(以及可选的,要执行操作的数据),并允许系统在设备上查找可以执行操作并启动该操作的组件。
如果有多个组件可以执行由意图描述的动作,则用户选择要使用的组件。

系统识别可以响应意图的组件的方式是将收到的意图与设备上其他应用程序的清单文件中提供的意图过滤器进行比较。

当您在应用程序的清单中声明一个活动时,您可以选择包含声明活动功能的意图过滤器,以便其可以响应其他应用程序的意图。您可以通过添加一个<intent-filter>元素作为组件的声明元素的子元素来为组件声明一个意图过滤器。

例如,如果您已经构建了一个包含撰写新电子邮件的活动的电子邮件应用程序,则可以声明一个意图过滤器来响应“发送”意图(以发送新电子邮件):

<manifest ... >
...
<application ... >
<activity android:name="com.example.project.ComposeEmailActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<data android:type="*/*" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>

然后,如果另一个应用程序使用ACTION_SEND操作创建意图并将其传递给startActivity(),则系统可能会启动您的活动,以便用户可以起草并发送电子邮件。

有关创建意图过滤器的更多信息,请参阅意向和意图过滤器文档。

六、声明app要求

有各种由Android提供的设备,并不是所有设备都具有相同的功能和功能。为了防止您的应用程序安装在缺少应用程序所需功能的设备上,请务必通过在清单文件中声明设备和软件要求,清楚地定义应用程序支持的设备类型的配置文件。大多数这些声明仅供参考,系统不会阅读它们,但是外部服务(如Google
Play)会读取它们,以便在用户从设备搜索应用程序时提供过滤。

例如,如果您的应用程序需要相机并使用Android
2.1(API 7级)中引入的API,则应将其声明为清单文件中的要求,如下所示:

<manifest ... >
<uses-feature android:name="android.hardware.camera.any"
android:required="true" />
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
...
</manifest>

现在,没有相机且Android版本低于2.1的设备无法从Google Play安装您的应用。

但是,您也可以声明您的应用程序使用相机,但不需要它。在这种情况下,您的应用程序必须将required属性设置为“false”,并在运行时检查设备是否具有摄像头,并适当地禁用任何摄像机功能。

有关如何管理应用程序与不同设备的兼容性的更多信息,请参阅设备兼容性文档。

七、app资源

一个Android应用程序不仅仅是代码组成,它需要与源代码分离的资源,例如图像,音频文件以及与应用程序的可视化呈现有关的任何内容。例如,您应该使用XML文件定义动画,菜单,样式,颜色和活动用户界面的布局。
使用应用程序资源可以轻松更新应用程序的各种特性,而无需修改代码,并提供一套备用资源 - 可让您针对各种设备配置(如不同的语言和屏幕尺寸)优化应用程序。

对于您在Android项目中包含的每个资源,SDK构建工具定义了一个唯一的整数ID,您可以使用它来从应用程序代码或从XML定义的其他资源引用资源。例如,如果您的应用程序包含名为logo.png的图像文件(保存在res
/ drawable /目录中),SDK工具将生成名为R.drawable.logo的资源ID,可用于引用该图像并将其插入在您的用户界面。

提供资源与您的源代码分开的最重要的方面之一是您可以为不同的设备配置提供替代资源。
例如,通过在XML中定义UI字符串,您可以将字符串转换为其他语言,并将这些字符串保存在单独的文件中。 然后,根据您附加到资源目录名称的语言限定符(例如res / values-fr / for法语字符串值)和用户的语言设置,Android系统将适当的语言字符串应用于您的UI。

Android为您的替代资源支持许多不同的限定符。限定符是一个短字符串,您可以以资源目录的名称包含该字符串,以便定义应使用这些资源的设备配置。
作为一个例子,您通常应根据设备的屏幕方向和大小为您的活动创建不同的布局。例如,当设备屏幕处于纵向(高)时,您可能希望具有垂直的按钮布局,但是当屏幕处于横向(宽)时,按钮应水平对齐。
要根据方向更改布局,您可以定义两个不同的布局,并将适当的限定符应用于每个布局的目录名称。然后,系统根据当前的设备方向自动应用适当的布局。

有关您可以在应用程序中包含的各种资源的更多信息,以及如何为不同的设备配置创建替代资源,请阅读“提供资源”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: