赞
踩
安卓应用程序是用Java编程语言所写的。安卓SDK工具将代码和数据还有资源文件编译到一个后缀为.apk的安卓包中。一个单独的.apk文件中的所有代码被认为是是一个应用,并且是安卓设备上安卓文件所使用的文件。一旦安装到设备上,每个安卓应用生存在自己的安卓沙盒中:
- 安卓设备是一个多用户Linux系统,其中的每个应用时一个不同的用户。
- 默认情况下,系统会给每个应用设置一个独一无二的Linux用户ID(这个ID仅仅被系统所使用并且对应用保密)。系统给在一个应用中的所有文件设置了权限,因此只有签名过的应用的User ID才有权限使用这些资源。
- 每个进程都有它自己的虚拟机(VM),一一个应用的代码的运行是与其它的应用隔离开来的。
- 默认情况下,每个应用运行在它自己的Linux进程中。当一个应用的任何组件需要被执行的时候,安卓系统会开启一个进程,然后当它不在需要的时候或者系统需要为其它应用回复内存时关闭一个进程。
安卓系统用这种方式来执行最近优先原则。每个应用默认仅有权接触到需要做自己工作的组件。这中应用不能接触到系统没有给它权限的方式创造了一个安全的环境。
然而,对一个应用来说,也有几种方式与其它应用来共享数据和获得系统服务:
- 对两个应用来说是有可能通过共享同一个Linux user ID 来使他们能够获得互相之间的文件资源。通过保存系统资源,有着相同 user ID的应用也能够安排在同一个Linux进程中,共享同一个虚拟机(这些应用也必须有相同的签名证书)。
- 一个应用也能够请求获得设备数据的权限,例如:用户的通讯录,SMS信息,大数据存储(SD卡),照相机,蓝牙,等等。所有的应用权限必须在用户安装的时候限定。
那些包含了一个安卓应用是如何生存与在系统中的基本知识。这个文档的其余部分向你介绍:
应用组件是一个安卓应用的核心组件。每个组件是系统能够进入你的应用的不同切入点。对用户来说,不是所有的组件都是真实的入口,一些是相互依存的,但是每个组件作为它自己的实体生存并且扮演这特殊的角色——每一个都是独一无二的构件来帮助你定义应用的所有行为。
这儿有四种不同类型的应用组件。每种类型都有特定的目的,还有着不同的来定义组件创建和销毁的生命周期。
下面是四种组件的基本简介:
Activities
一个activity代表了一个用户界面的单独屏幕。例如,一个邮件应用可能有一个activity显示新邮件的列表,另外一个邮件来写一个邮件,再一个activity来读取一个邮件。尽管在一个邮件的用户体验中所有的activities紧密地相互合作,但是他们之间是相互独立存在的。同样地,一个不同的应用能启动这些activities中的任何一个(如果这些邮件应用允许的话)。例如,一个照相机应用能够启动在邮件应用中的activity来写一封新有劲啊,让用户来分享图片。
一个activity是作为Activity的子类来实现的,你能够在Activities中了解更多关于它的知识。
Services
服务是运行于后台来执行那些需要长时间运行的操作或者来为之前的进程来执行工作的一种组件。服务是不提供用户界面的。例如,一个service可能后台播放音乐,当用户在不同的应用中时,或者它可能在不阻塞有着用户界面的activity情况下来通过网络来抓取数据。另外的组件,例如 activity,能够启动一个service并且让他运行或者绑定它到自身为了与之交互。
Content providers
内容提供者管理共享的应用数据。你能够存储数据在文件系统中,一个SQLite数据库,在网络上,或者任何其他的你的应用可以解除的永久存储位置。通过内容提供者,其它的应用能够查询或者甚至来修改数据(如果内容提供者允许的话)。例如,安卓系统提供了一个内容提供者来管理用户的通讯录信息。同样地,任何有着正确权限的应用能够查询内容提供者的部分来对一个特定的人读取或者写入信息。
内容提供者对读写对应用私有的和非共享的数据来说仍然是有效的。例如,Note Pad 例子中的应用使用内容提供者来存储便签。
Broadcast receivers
广播接收者是一个对全系统广播公告回应的组件。许多广播起源于系统—例如,一起广播宣布屏幕关闭,电池的电量低,或者一个图片被截取。应用也能够发起广播—例如,让其他的应用知道一些数据被下载到设备上和能够被他们所使用。尽管广播接受者不呈现一个用户界面,但是它们可能创建一个状态栏通知来警示用户当一个广播发生的时候。然而,广播接受者对其它的应用来说仅仅是一个门户,它是被用来做非常少量的工作。举例来说,它可能初始化一个service来执行一些基于时间的工作。
安卓系统的一个独一无二的设计是任何一个应用能都启动其他应用的组件。例如,如果你想让用户用设备相机来截取一张图片,这儿可能有另外的应用来做这件事情,然后你的应用来使用它,这样就代替了开发一个捕获图片的activity。你不需要合并甚至链接与相机应用相关的代码。想法,你能很简单地启动相机的activity来捕获图片。当完成的时候,图片甚至返回到你的应用,因此你能够使用它。对用户来说,这好像相机确实是你应用中的一部分。
当系统启动一个组件的时候,它会为那个应用启动一个进程和实例化那个组件所需要的类。例如,如果你的应用启动相机应用的activity来捕获图片,这个activity运行在属于相机应用的进程中,不是你应用的进程中。因此,不像在大部分其他系统中的应用一样,安卓应用没有一个单独的实例入口(这儿没有main()函数,例如)。
因为安卓系统运行在分离开的进程中来运行应用,进程的文件权限对其他应用来说也是严格的,你的应用不能直接的激活其他应用中的组件。然而,安卓系统能够做到。因此,为了激活其他应用中的组件,你必须给系统传递一个消息来表明你的意图去启动特定的组件。系统能给为你激活组件。
激活组件
四种组件类型中的三种——activities,services,和broadcast receivers——是被叫做intent的异步信息所激活。intents将在运行时的组件相互捆绑到一起(你可以讲它们想象成一个需要从其他组件行为的信息载体),不论这个组件是属于你的应用还是其它的应用。
一个intent是被创建成一个Intent对象,并定义一个信息来激活一个特定的组件或者一种特定类型的组件——一个intent可以是明确的或者模糊的,分开地。
对activities和services来说,一个intent定义了需要执行的活动(例如,使查看或者发送一些东西),也可能指定了URI的数据来执行(在一些组件被执行需要知道的事情中)。例如,一个intent可能传输为一个activity一个请求来展示一个图片或者打开一个web页面。在一些情况中,你能够启动一个activity来接受结果,在一种情况下,activity也能在一个intent中返回结果(例如,你能发出一个intent来让用户选择一个个人通讯录和让这个选择返回给你——返回的intent包括一个只想被选择的通讯录的URI)。
对广播接受者来说,intent简单地定义了被广播的公告(例如,一个指示设备电量低的广播进京包括了一个已知的知识电量低的字符串行为)。
The Manifest File
在安卓系统能够启动一个应用组件之前,系统必须通过读取应用的AndroidManifest.xml 文件来确定这个组件的存在。你的应用必须在应用工程根目录的manif 文件中来声明它的所有组件。
除了声明应用组件之外,manifest文件还做了一些其它的事情,例如:
确认应用需要的一切用户权限,例如网络连接,或者读取用户通讯录的权限。
声明应用所需要的最小API Level,基于应用所使用的APIs。
声明应用需要得或者请求的硬件和软件,例如,相机,蓝牙服务,或者多点触控屏幕。
应用所需要链接的API库(除了安卓框架的APIs),例如Google Maps 库。
更多。
声明组件
manifest的主要任务是告知系统关于应用的组件。例如,一个manifest文件能像下面这样声明一个activity:
<?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 属性指向定义应用icon的资源。
在<activity>元素中,android:name属性指明了Activity子类的类名全称,android:label属性指定了一个用于activity可见的用户标签的字符串。
你必须声明所有应用组件以这种方式:
<activity>
elements for activities<service>
elements for services<receiver>
elements for broadcast receivers<provider>
elements for content providers
包含在源文件中但是没有在manifest文件中声明的activities,services,和content providers对系统是不可见的,通常情况下也是不可运行的。然而,broadcast receivers 既能在manifest中声明或者在代码中动态创建(想BroadcastReceiver 对象)和通过调用registerReceiver()来注册到系统中。
声明组件功能
如上面讨论的一样,你能使用Intent来启动activites,services,和broadcase receivers。你能通过明确地指出目标组件名字在Intent中来启动它们。然而,intents文件的主要用途是intents actions 的概念里。使用actions,你简单地形容你想要执行的action类型(你还可以选择你想要执行的action的数据),允许系统在设备上查找一个可以执行action的组件并且启动它。如果这里有多个组件能够执行intent对应的action,然后用户选择需要的那一个。
系统识别能够回应intent的组件是通过将接收到的intent与在设备中其它应用的manifest文件的intent 过滤器进行比对。
当你在你的应用manifest中声明一个组件,你可以有选择地包含这个组件功能的intent过滤器,这样它就可以可以对其它应用的intents进行回应。你能够通过增加一个<intent-filter>标签作为声明组件标签的子集来声明一个intent 过滤器。
例如,一个邮件应用中的写新邮件的activity可能在它的manifest文件入口中声明一个intent过滤器对“send”intents做出回应(为了发送邮件)。然后在你应用中的activity中创建一个有着"send"action的intent(ACTION_SEND),系统将它与邮件应用的“send”activity相匹配,当你用intent和startActivity()使,系统启动这个activity。
声明应用要求
有很多被安卓支持的设备,但他们并不是所有的都有相同的特征和功能。为了防止你的应用安装在缺少你应用所需要特征的设备上,清晰地定义你的应用所支持的设备类型概括通过在manifest文件中声明设备和软件需求是非常重要的。大部分声明仅仅是作为信息使用而且系统也不会读取它们,但是外部的服务项Google Play会读取它们来为用户在为他们的设备搜寻应用时提供过滤功能。
例如,如果你的应用需要一个相机和使用在Android2.1中的APIs(API Level 7),你应该在你的manifest文件中声明这些需求。这样的话,那些没有相机和安卓版本低于2.1的设备就不能从Google Play中来安装你的应用。
然而,你也能声明你的应用使用相机,但是可以不必须使用它。在这种情况下,你的应用必须在运行时来检查设备是否有相机并且禁用任何需要使用相机的功能如果相机不存在的话。
这儿有一些重要的设备特征你应该作为设计和开发应用的参考:
屏幕尺寸和分辨率
为了通过屏幕类型给设备分类,安卓给每个设备定义了两个特征:屏幕尺寸(屏幕的物理大小)和屏幕分辨率(屏幕的像素密度,或者
dpi—dots)。为了简化屏幕配置的所有类型,安卓系统将它们概括成可选择的组来使它们更容易配置。
屏幕尺寸:小,正常,大,超大。
屏幕分辨率:低,中,高,超高分辨率。
默认情况下,你的应用对所有的屏幕尺寸和分辨率是兼容的,因为安卓系统会对你的UI布局和图片资源进行合适的调整。然而,你应该为特定的屏幕尺寸指定特定的布局和给特定的分辨率指定特定的图片,使用可选择的布局资源,和通过在你的manifest文件里使用<support-screens>标签来准确地声明你的应用支持哪种屏幕尺寸。
输入配置
许多设备提供了不同类型的输入途径,例如键盘,轨迹球,或者五键导航。如果你的应用需要特别的输入硬件类型,你应在manifest中用<uses-configuration>来声明它。然而,需要特定的输入配置是很少见的情况。
设备特征
可能有许多硬件或者软件特征不存在与一个给定的安卓设备上,例如,相机,感光器,蓝牙,特定的OpelGL版本,或者触摸屏的精确度。你应该从来不假设一个特定的属性存在于所有的安卓设备上(除了已存在的标准安卓库),因此你应该通过<uses-feature>标签来声明你的应用所使用的特征。
平台版本
不同的安卓设备经常运行不同版本的安卓平台,例如安卓1.6或者安卓2.3。每个成功的版都经常包括之前的版本没有的额外的APIs。为了指明哪个APIs集合存在,每个平台版本都指定了API级别(例如,安卓1.0是Level 1,安卓2.3是API Level 9)。如果你使用任何在版本1.0后添加到平台的APIs,你应该使用<uses-sdki>标签来声明被使用的APIs的最小级别。
声明应用中的所有要求是重要的,因为,当你在Google Play上发布你的应用时,商店使用这些声明来过滤在每种设备上的应用。同样地,你的应用应该仅对那些符合你的应用要求的设备可用。
应用资源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。