(API GUIDE 2)APP FUNDAMENTALS(应用基础)

来源:互联网 发布:免费数据恢复精灵 编辑:程序博客网 时间:2024/05/24 07:40

应用的基础

这一节是综述了安卓应用的安装运行,软硬件兼容,以及各个部件的工作过程

安卓的应用是用java程序设计环境写出来的。安卓SDK工具编译你的代码——和所有的数据和资源文件一块儿——生成一个APK文件:一个安卓安装包,这是一个带有.apk后缀的存档文件,一个APK文件包含了一个安卓应用所有的内容,并且是基于安卓的设备用来安装应用的文件。


一旦安装在了设备中,每个安卓应用会呆在它自己的安全沙盒中:

安卓操作系统是一个多用户的Linux系统,每个应用都是一个不同的用户。

缺省条件下,系统给每个应用指派一个独一无二的Linux用户ID号。系统为应用中的所有文件设置为允许以便只有指派到那个应用的访问他们。

每个进程有他自己的虚拟机,所以一个应用的代码的运行是独立的。

缺省条件下,每个应用运行在自己的linux进程中。当任何应用的成分需要被执行的时候安卓就会启动进程,然后当它不在需要或者当系统必须为其他应用恢复内存的时候关闭进程。


用这种方式,安卓系统实现了最小权限原则,即每个应用在缺省条件下只能访问请求做工作的成分。这生成了一个非常安全的环境,这个环境里一个应用不能访问系统中没有给予允许的部分。


可是,这里有很多种方法使得一个应用可以和其他应用共享数据,或者使得一个应用访问系统服务:

安排两个应用共享一个Linux 用户ID号时可能的,这种情况下,他们能够访问对方的文件。为了维护系统资源,带有通过养的用户ID的应用也可以安排在同样的Linux进程下运行并且共享同样的虚拟机(应用必须也被同样的认证所标记)。

一个应用可以请求允许来访问设备数据诸如用户的合同,SMS消息,可安装的存储设备(SD 卡),相机,蓝牙模块,还有其他很多。所有的应用权限必须被用户在安装的时候赋予。


上面介绍了一个安卓应用如何存在于系统里的一个基本的认识,下面介绍:

1、定义你的应用的核心框架部件。

2、你申明部件并且为你的应用请求设备特色的manifest文件。

3、从应用代码中分离开的并且允许你的应用位不同的设备配置优雅地优化它的行为的资源。


应用的成分

应用的成分是建立一个安卓应用基本建设块。每个成分是一个不同的,通过这些点系统可以进入你的应用。不是所有的成分是真正的用户进入点,有一些是互相以来的,但是每一个成分都是作为他自己的实体而存在的并且扮演着一个特定的角色——每个成分是一个帮助你的应用定义总体行为的特殊的建设模块。

这里有四个不同种类的应用成分,每个种类服务不同的目的并且有一个不同的生命周期(定义一个成分是如何被生成和销毁)


活动:

一个活动代表带有一个用户接口的界面。例如,一个email应用可能有显示新邮件列表的一个活动,另一个活动包含了一个邮件,还有一个活动是为了阅读邮件的,即便这些活动一块儿工作在但自由舰应用中形成了一个内聚的用户体验,每一个活动也是独立于其他活动的。这样的话,一个不同的应用可以启动这些活动中的任何一个活动。例如,一个相机应用可以启动位于电子邮件中的包含新邮件的活动,为了让用户分享一张图片。

一个活动作为一个Activity的子类实现,你可以在Activityies developer guide中了解更多关于活动的信息。


服务:

服务是在后台执行长期操作或者为远程进程工作的一个成分。一个服务不提供用户接口。例如,一个服务可能在用户处于一个不同的应用中的时候播放背景音乐,或者它可能从网络取数据而不会打断用户和一个活动之间的交互。另一个成分,例如活动,可以启动服务并且让它执行或者绑定以便和它进行交互。

一个服务是作为一个服务的子类实现的,你可以从Services developer guide获取关于服务的更多的信息。


内容提供者:

内容提供者管理一个共享的应用数据集合。你可以在文件系统存储数据,一个SQLite数据库,一个网站,或者其他任何应用可以访问的永久的存储位置。即便是内容提供者,其他的应用可以查询或者修改数据(如果内容提供商允许的话)。例如,安卓系统提供一个内容提供者管理用户的联系信息。这样,任何的带有释放权限的应用可以请求部分内容提供者(如ContactsContract.Data)来完成关于特定人的信息的读写。

内容服务者对于哪些应用私有的不可共享的可读写数据也是有用的,实例应用Note Pad就是使用一个内容个提供者来保存笔记的。

一个内容提供者是作为一个内容提供者的子类实现的并且必须实现一个标准API的集合使得别的应用也可以进行交互操作。想要获得更多的信息,见Content Providers developer guide.


广播接收者

一个广播接收者是个响应全系统广播的成分。许多广播来自系统——例如,一个广播宣布界面关闭,电池电量低,或者图片捕捉。应用也可以初始化广播——例如,让其他应用知道一些数据已经被下载到了设备并且已经是可用的了。即使广播没有提供用户接口,他们可能生成一个状态条告示,通知用户一个一个广播事件发生了。更普遍的是,即使,一个广播接收者只是一个对于其他成分的门户,并且准备做非常少量的工作。例如,它可能初始化一个服务来根据事件处理一些工作。

一个广播接受者是作为一个BroadcastReceiver的子类实现的,并且每个广播作为一个Intent被发送.详情请见BroadcastReceiver 类。


安卓系统设计的一个最独特的方面是任何一个应用可以启动另一个应用的成分。例如,如果你希望用相机捕捉一张照片,这里可能会有另一个应用作者做这件事而你的应用可以使用它,而不需要发展一个活动那个来自己捕捉照片。你不需要包含甚至连接到相机应用的代码。取而代之的是,你可以简单地气筒相机应用的活动来捕捉一张照片。完成之后,照片会被返回给你的应用以便呢可以使用它。对于用户,它就好像相机就是你的应用的一部分。

当系统启动一个成分,它为那个应用启动进程(如果它还没有运行),并且实例化这个成分所需要的类。例如,如果你的应用启动在你的相机应用里的活动来捕捉一张相片,活动在属于相机应用的进程中运行,而不在你的应用中。所以,不像在其他大多数系统,安卓应用没有一个单独的入口(没有main()函数)

由于系统在一个分离的带有文件权限限制访问其它应用的进程中运行每个应用,你的应用不能直接调用一个别的一个应用中的一个成分。而安卓系统,它可以。所以调用一个其它应用的成分,你必须发送一个消息制定你的intent来启动特定的成分。系统然后为你调用那个成分。


激活成分

三个成分——活动,服务,和广播接收者——是需要被一个异步的称作intent的消息激活的。Intents在运行的时候将成分互相绑定起来(你可以想象他们是一个从其他成分请求动作的信使),无论这个成分是否属于你的应用。

一个intent是用一个Intent对象建立起来的,它定义了一个消息来调用一个成分或者是一个特定的成分种类——一个Intent要么是显示的,要么是隐式的。

对于活动和服务,一个intent定义动作来执行(如,查看或者发送一些东西)或者也会指定数据的URI来执行(再其他的事情中被启动的成分可能需要知道的)。例如,一个intent可能为一个活动传递一个请求来展示一个镜像或者打开一个网页。在一些情况下,你可以启动一个活动来接受一个结果,在这种情况下,活动也返回在一个Intent中返回结果(例如,你可以发出一个intent让用户选择一个个人联系并且将它返回给你——这个范惠芬intent包含了所选的联系的URI点)。

对于广播接收者,intent 简单地定义了被广播的声明(例如,一个指示电池电量低的广播只是一个带有字符串“电池电量低”的已知的动作而已)。

另一个成分种类,内容提供者, 不是被intent 激活的。它是当被一个来自contentresolver的请求当做目标的时候激活的。内容解析者处理所有直接的和内容提供者的交互以便正在执行和提供者进行交互的成分不需要(处理),取而代之的是,调用Contentresolver对象的方法。这就在内容个提供者和成分请求信息之间留下了一层抽象层(为了安全)。


以下是激活每个种类成分的方法:

你可以启动一个活动(或者说是给它一些新的事情做)通过传递一个Intent到startactivity()或者startactivityforresult()(当你希望这个货返回一个结果的时候)

你可以启动一个服务(或者给一个正在执行的服务一个新的指令)通过传递intent到startservice()。或者你可以绑定服务通过传递一个intent到bindservice().

你可以初始化一个广播通过传递一个intent到诸如sendbroadcast(), sendorderedbroadcast(),或者sendstickybroadcast()的方法。

你可以执行查询内容提供者通过调用query()或者一个contentresolver.


关于使用intent更多的信息,见intents and intent filters 文档。更多关于激活特定的成分的信息也提供在下面的文档里:Activities,Services,BroadcastReceiver,Content Providers.


Manifest 文件

在安卓系统可以启动一个应用成分之前,系统必须通过阅读应用的AndroidManifest.xml知道成分存在。你的应用必须在这个文件里声明所有它的成分,这个文件必须在应用工程文件夹的根目录下。

这个舱单除了申明一个应用的成分外还做很多的事情。例如:

1、识别应用请求的任何用户权限例如互联网访问或者读访问用户的联系。

2、申明应用要求的最小API级别,根据应用使用的API.

3、申明应用要求的硬件和软件的特色,诸如相机,蓝牙服务或者多点触控屏幕

4、应用需要被链接到的API库(除了安卓框架API外),例如Google Maps Library.

5、未完待续


声明成分

舱单的一项基本任务就是告知系统应用的成分。例如,一个舱单文件可以按照如下申明一个活动:

<?xml version="1.0" encoding="utf-8"?>

<manifest ... >

    <applicationandroid:icon="@drawable/app_icon.png" ...>

        <activityandroid:name="com.example.project.ExampleActivity"

                  android:label="@string/example_label" ...>

        </activity>

        ...

    </application>

</manifest>


在<application>元素中,android:icon特征指向一个标识应用的图标资源。

在<activity>元素中,android:name特征指定完全合格的类名(Activity的子类),android:label特征制定一个字符串来作为用户可见的活动标签使用。


你必须这样申明所有的应用成分:

<activity>活动的元素

<service>服务的元素

<receiver>广播接收者的元素

<provider>内容提供者的元素

包含在资源里的活动,服务和内容提供者如果不在manifest文件里的话,对于系统是不可见的,结果,永远不会被执行。可是,广播接收者可以被申明在manifest文件或者动态在代码里生成(像BroadcastReceiver对象一样)并且通过调用registerrecerver()在系统里注册。


更多的关于如何在应用中构建manifest文件的信息,详见 The AndroidManifest.xml File文件。


申明成分的能力

如上面讨论的,在激活成分的时候,你可以使用一个Intent来启动活动,服务和广播接收者。你可以在intent中显示地命名目标成分(使用成分类名)。不过,intents真正的力量依赖于隐式intents的概念。一个隐式的intent简单描述将要执行的动作的种类(还有,可选择地,你想要执行的动作上面的数据)并且允许系统在设备上找到一个可移植性动作的成分并且启动它。如果有多个成分可以执行这个动作,那么用户选择用哪一个。

系统识别出能够响应intent的成分的方式是通过比较收到的intent和设备上其他应用中的manifest文件里提供的intent 过滤器.

当你在你的应用舱单中申明了一个活动,你可以选择性地包含intent过滤器来申明活动的能力所以它可以响应来自其他应用的intents.你可以通过添加一个<intent-filter>元素作为成分申明元素的一个孩子来为你的成分申明一个intent过滤器。

例如,如果你已经建立一个带有包含一个新邮件的活动的电子邮件应用,你可以申明一个intent过滤器来响应“send”intents(为了发送一封信邮件)像这样:

<manifest ... >

    ...

    <application ... >

        <activityandroid:name="com.example.project.ComposeEmailActivity">

            <intent-filter>

                <actionandroid:name="android.intent.action.SEND"/>

                <data android:type="*/*"/>

                <categoryandroid:name="android.intent.category.DEFAULT"/>

            </intent-filter>

        </activity>

    </application>

</manifest>

这样,如果另一个应用生成而一个带有ACTION_SEND的intent动作并且将它传递给startActivity(),系统可能启动你的活动所以用户可以写草稿或者发送一个邮件。

更多关于生成intent过滤器的信息,见intents and intent Filters文档。


申明应用请求

有各种各样的被安卓带动的设备并且并不是所有的设备都提供同样的特色和能力。为了防止你的应用被安装在缺少你的应用所需要的特色的设备上,你通过在manifest文件里申明设备和软件请求清晰地定义一个包含你的应用支持的设备种类的文件。大多数这些申明只是个负有信息的,但是系统不回去读他们,但是永久的服务例如Google play会去读他们为了给用户在查找应用的时候提供过滤。


例如,如果你的应用请求一个相机并且使用Android 2.1引进的API,你应该在manifest文件中申明这些作为请求信息:

<manifest ... >

    <uses-featureandroid:name="android.hardware.camera.any"

                  android:required="true"/>

    <uses-sdkandroid:minSdkVersion="7"android:targetSdkVersion="19"/>

    ...

</manifest>

这样,没有相机或者使用低于2.1等级API的设备不能安装这个应用。

然而,你也可以申明你的应用使用相机,但是没有请求他。这种情况下,你的应用必须设置required特征为“false”并且在运行的时候检查设备是否有相机并且屏蔽所有相机的特色以兼容。

更多关于如何管理你的应用和各种设备兼容性的信息在Device Compatibility文档提供。



应用资源

一个安卓应用不仅仅包含代码——它要求分离于源代码的资源,诸如图片,音频文件,和其他任何和应用界面展示相关的东西。例如,你应该用XML文件定义动画,菜单,风格,颜色,和活动用户接口的布局。使用应用资源使得不改动代码修改应用的特征更加方便简单并且——通过提供可选的资源集合——使你为各种不同的设备配置优化你的应用(诸如不同的语言和屏幕大小)。

对于包含在你的安卓工程中的任何资源,SDK搭建工具定义了一个独特的序号,你可以使用这个号码来从你的应用的代码或者其他在XML中定义的资源中引用资源。例如,如果你的应用包含一个图片叫做R.drawable.logo,你可以用它来引用图像并且将它插入到你的用户接口中。

提供独立于源代码的资源的最重要的一点是给与你为不同的设备配置提供可选的资源的能力。例如,通过在XML中定义UI字符串,你可以将字符串转化成其他的语言并且将这些字符串保存在独立的文件中。然后,根据你加载资源目录名称后面的语言限定符(像res/values-fr/是法语字符串的限定符)和用户语言设置,安卓系统应用合适的语言字符串到你的UI.

安卓为你的可选择的资源提供了许多不同的限定符。限定符就是一个包含在资源目录名字后面为了定义那些资源适用的设备配置的短字符串。另一个例子是,你应该根据设备的方向和大小为你的活动经常生成不同的布局。例如,当设备屏幕处于竖直方向,你可能希望有个按钮是竖直的布局,但是当屏幕处于横置状态,按钮应该被水平安排。为了能够根据方向改变布局,你可以定义两个不同的布局并且应用适当的限定符到每个布局目录名称。之后,系统就会自动的根据当前的设备方向选择应用适当的布局。


更多的关于你可以加载应用中的不同种类的资源和如何为不同的设备配置产生可选择的资源,请阅读Providing Resources.


0 0
原创粉丝点击