Android应用程序都写在Java编程语言。 Android包,它与.apk文件后缀的归档文件:Android的SDK工具,任何数据和资源文件 - 成APK编译代码一起。一个APK文件包含一个Android应用程序的所有内容,并且是Android设备用于安装应用程序的文件。
一旦设备上安装,每个Android应用程序住在自己的安全沙箱:
Android操作系统是一个多用户的Linux系统中,每个应用程序是不同的用户。
默认情况下,系统将分配每个应用了独特的Linux用户ID(该ID是由系统只使用,是未知的应用程序)。该系统为所有的文件权限的应用程序,以便只分配给该应用程序的用户ID可以访问它们。
每个进程都有自己的虚拟机(VM),所以应用程序的代码从其他应用程序隔离运行。
默认情况下,每一个应用程序在自己的Linux进程中运行。 Android的启动过程中,当任何一个应用程序的组件需要被执行,然后关闭过程中,当它不再需要或系统必须为其他应用程序恢复内存。
这样一来,Android系统实现了最小特权原则。也就是说,每一个应用程序,默认情况下,只有到它需要做的工作并没有更多的组件的访问。这将创建在其中的应用程序不能访问它没有获准部分系统非常安全的环境。
不过,也有一个应用与其他应用程序和应用程序访问系统服务数据的方法:
这是可能的两个应用程序共享相同的Linux用户ID,在这种情况下,他们能够互相访问对方的文件安排。为了节约系统资源,拥有相同的用户ID的应用程序也可以安排在同一个Linux进程运行,并共享相同的VM(即应用程序也必须使用相同的证书签名)。
应用程序可以请求权限访问设备数据,如用户的联系人,短信,可安装存储(SD卡),摄像头,蓝牙,等等。所有的应用程序的权限必须在安装时用户授予。
这涉及对Android应用程序在系统中如何存在的基础。本文的其余部分向您介绍:
定义你的应用程序的核心框架组件。
manifest文件中声明组件和所需的设备功能,为您的应用程序。
资源是从应用程序代码分开,并允许您的应用程序优雅地优化自己的行为,适用于各种设备的配置。
应用组件
应用组件是一个Android应用程序的最重要的基石。每个组件都是一个不同的角度,通过该系统可以进入你的应用程序。并非所有的组件对于用户的实际切入点和一些互相依赖,但每一个存在作为自己的实体,扮演一个特定的角色,每个人都是一个独特的建筑块,它帮助定义应用的整体行为。
有四种不同类型的应用程序组件。每种类型提供不同的目的,并具有明显的生命周期,它定义了如何创建组件和销毁。
这里有四种类型的应用程序组件:
活动
活性表示具有用户接口的单一屏幕。例如,电子邮件应用程序可能有一个活动,显示新的电子邮件列表,另一个活动撰写电子邮件,和另一项活动阅读电子邮件。虽然活动共同形成的电子邮件应用程序一个有凝聚力的用户体验,每一个都是相互独立的。因此,不同的应用程序可以启动这些活动中的任何一个(如电子邮件应用程序允许)。例如,相机应用可以就在构成新的邮件,以便为用户共享一个图象的电子邮件应用程序的活性。
一个活动被实现为活动的子类,你可以学习活动开发者指南中更多。
服务
服务是在后台运行,执行长时间运行的操作或为远程进程执行工作的一个组成部分。服务不提供用户界面。例如,一个服务可能,而用户是在一个不同的应用程序在背景中播放的音乐,或者它可能不会阻塞与一个活动的用户交互获取网络上的数据。另一组件,如一个活动,可以启动该服务,并让它运行或与其结合,以与它进行交互。
服务实现为服务的子类,你可以了解更多关于它的服务开发者指南中。
内容提供商
内容提供商管理一组共享应用程序数据。你可以存储数据在文件系统,SQLite数据库,在网络上,或任何其他持久性存储位置您的应用程序可以访问。通过内容提供商,其他应用程序可以查询甚至修改数据(如果内容提供商允许)。例如,Android系统提供了管理用户的联系人信息的内容提供商。因此,有相应权限的任何应用程序可以查询内容提供商(如ContactsContract.Data)的一部分,阅读和写某个人的信息。
内容提供商也用于读取和写入数据是私有的,以您的应用程序,而不是共享有用。例如,笔记本示例应用程序使用一个内容提供商,以节省笔记。
内容提供商实现为ContentProvider的子类必须实现一组标准的API,使其他应用程序来执行交易。欲了解更多信息,请参阅内容提供商开发指南。
广播接收机
的广播接收机是响应全系统广播通知的成分。许多广播从系统中,例如发起,广播宣布,该显示屏已经关闭,电池电量低,或图片被抓获。应用程序也可以发起广播 - 例如,为了让其他应用程序知道一些数据已经下载到设备上,并为他们提供使用。虽然广播接收机不显示用户界面,它们可以创建一个状态栏通知当广播事件发生时,以提醒用户。更常见的是,虽然,一种广播接收机仅仅是一个“网关”到其他组件,并打算做工作的一个非常小的量。例如,它可能会启动一个服务来执行基于事件的一些工作。
广播接收器实现为广播接收器的子类,每个广播是作为一个Intent对象。欲了解更多信息,请参阅广播接收器类。
Android系统设计的一个独特的方面是,任何应用程序可以启动另一个应用程序的组件。例如,如果你希望用户捕捉设备相机中的照片,还有可能是另外一个应用程序,这是否和你的应用程序可以使用它,而不是开发活动给自己拍摄照片。不需要掺入或者甚至从相机应用链接到代码。相反,你可以简单地开始捕捉照片的相机应用的活动。完成后,照片甚至还给你的应用程序,所以你可以使用它。对于用户来说,它好像相机其实就是你的应用程序的一部分。
当系统启动一个组件,它会启动过程的应用程序(如果它尚未运行),并实例化所需组件的类。例如,如果你的应用程序开始在捕捉照片的相机应用程序的活动,该活动在所属的相机应用,而不是在你的应用程序的进程的进程中运行。因此,与大多数其他系统的应用,Android应用没有一个单一的入口点(有没有main()函数,例如)。
由于该系统运行在与限制访问其他应用文件权限一个单独的进程每个应用程序,应用程序不能直接激活另一个应用程序的组件。而Android系统,但是,可以。因此,要激活的组件在其他应用程序,您必须到指定你的意图启动特定组件的系统传递信息。然后,系统激活组件为您服务。
激活组件
四个组件类型的活动,服务和广播的三个接收器,通过一个异步消息激活称为意图。意图在运行时(你可以把它们想象成那些要求从其他组件的动作使者)单个组件相互结合,组件是否属于您的应用程序或其他。
意图与一个意图对象,它定义了一个消息,以激活一个特定的组件或特定类型组件的意图可以是显式的或隐式的,分别创建。
为活动和服务,意图定义要执行的操作(例如,“查看”或“发送”的东西),并且可以指定URI中的数据的作用于(除其他事项外,该组件被启动可能需要知道)。例如,意图可能传达的请求的活动,以显示图像或打开一个网页。在某些情况下,你就可以开始一个活动收到结果,在这种情况下,该活动也将返回一个意图的结果(例如,您可以发出一个意图,让用户选择一个个人联系人,并将它归还给你了-THE返回意图包括一个URI指向选中的联系人)。
对于广播接收机,意图简单的定义内广播通知(对于考试PLE,广播,表示该设备电池电量低时只包括已知的动作字符串,表示“电池电量低”)。
其它组分的类型,内容提供者,不意图激活。相反,当通过从ContentResolver的一个请求目标被激活。内容解析器处理与内容提供商的所有直接交易,这样一个与供应商执行交易组件并不需要,而是调用ContentResolver的对象的方法。这使得内容提供者和组分请求信息(安全性)之间的抽象层。
有激活每种类型的组件的单独的方法:
你可以开始一个活动(或给它一些新的东西做)(当你想活动返回一个结果)通过传递一个Intent给startActivity()或startActivityForResult()。
您可以启动服务(或者给一个持续的服务新的指令)传递的意图,startService()。或者,你可以通过传递一个Intent给bindService绑定到服务()。
你可以通过传递一个Intent给方法,如sendBroadcast(),sendOrderedBroadcast(),或sendStickyBroadcast发起广播()。
你可以通过调用查询()在ContentResolver的执行查询到内容提供商。
有关使用意图的更多信息,请参阅意图和意图过滤器的文件。活动,服务,广播接收器和内容提供商:在下面的文档还提供了有关激活特定组件的详细信息。
清单文件
之前Android系统可以启动一个应用程序组件,系统必须知道该组件通过阅读应用程序的AndroidManifest.xml文件(以下简称“清单”文件)存在。您的应用程序必须申报其在该文件中的所有组件,它们必须在应用程序项目目录的根目录。
清单做了一些除了声明应用程序的组件,如事情:
确定所有用户权限的应用程序需要,如互联网接入或以只读方式访问用户的联系人。
声明由应用所要求的最低API级别,在此基础上的API应用程序使用。
声明由应用程序使用或所需的硬件和软件功能,如摄像头,蓝牙服务,或者多点触摸屏。
API库的应用程序需要对(除Android的框架API),如谷歌地图库链接。
和更多
声明组件
清单的首要任务是要通知系统应用程序的组件。例如,如下清单文件可以宣布任何活动:
<?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:图标属性指向资源标识的应用程序的图标。
在<活动>元素,在android:name属性指定的Activity子类和android的完全限定类名称:标签属性指定的字符串作为该活动的用户可见的标签使用。
你必须这样声明所有的应用程序组件:
<活动>的活动元素
<服务>对服务的元素
<接收器>广播接收器元素
<提供商>为内容提供商元素
你在你的源代码,包括但并不在清单申报活动,服务和内容提供商都没有对系统可见的,因此,不能运行。然而,广播接收机既可以在清单中声明或致电registerReceiver在代码中动态创建(作为BroadcastReceiver的对象),并与系统中注册的()。
欲了解更多有关如何构建清单文件为您的应用程序,请参见AndroidManifest.xml文件文档。
声明组件功能
如上所述,在激活的组件,你可以用一个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(),该系统可以开始你的活动,以便用户可以起草和发送电子邮件。
欲了解更多有关创建意图过滤器,请参阅意图和意图过滤器的文件。
声明应用需求
有各种搭载Android的设备,而不是所有的人都提供相同的特性和功能。为了防止您的应用程序被安装在没有通过您的应用程序需要的功能的设备,这一点很重要,你清楚你的清单文件中声明设备和软件要求定义的类型的设备您的应用程序支持文件。大多数这些声明是仅供参考,系统不会读取他们,但外部服务,如谷歌播放做阅读它们,以便为用户提供过滤当他们搜索从他们的设备的应用程序。
例如,如果你的应用需要一个摄像头,并使用了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更低无法安装谷歌从您的应用程式。
但是,您也可以声明你的应用程序使用的摄像头,但并不需要它。在这种情况下,您的应用程序必须设置必要的属性为“假”,并在运行时检查设备是否有一个摄像头,并禁用任何拍照功能为宜。
该设备兼容性文档中提供了有关如何管理不同的设备上应用程序的兼容性的详细信息。
应用资源
一个Android应用程序组成的不仅仅是更多的代码,它需要是独立的从源代码资源,如与应用程序的视觉呈现图片,音频文件,和任何东西。例如,您应该定义动画,菜单,样式,颜色,以及活动的用户界面与XML文件的布局。使用应用程序的资源可以很容易地更新应用的各种特性,而无需修改代码和提供成套替代资源,可以优化您的应用程序,适用于各种设备配置(如不同的语言和屏幕尺寸)。
对于您在Android项目包括每个资源的SDK构建工具定义一个唯一的整数ID,您可以使用从您的应用程序代码或在XML中定义的其他资源引用的资源。例如,如果你的应用程序包含一个名为logo.png的图像文件(保存在res /绘制/目录),SDK工具生成名为R.drawable.logo资源ID,您可以使用引用图像并将其插入在用户界面中。
其中一个从源代码提供独立资源的最重要的方面是您为不同的设备配置提供备用资源的能力。例如,通过在XML定义UI字符串,可以翻译字符串成其他语言,并保存在单独的文件的字符串。然后,根据您追加到资源目录名的语言限定词(如RES /值-FR /法语字符串值)和用户的语言设置,Android系统应用相应的语言字符串到你的UI。
Android支持你的替代资源很多不同的预选赛。限定符是您在资源目录的名称包括,以确定应该用于何种这些资源的设备配置的短字符串。再举一个例子,你应该经常为你的活动创建不同的布局,具体取决于设备的屏幕方向和大小。例如,当设备屏幕处于纵向(高),您可能希望有按钮的布局是垂直的,但是当屏幕处于横向(宽),按钮应水平排列。要改变取决于方向的布局,可以定义两个不同的布局和应用适当的限定符每个版面的目录名。然后,系统自动应用根据当前的设备方向的适当布局。
欲了解更多有关不同类型的资源,您可以在您的应用程序以及如何为不同的设备配置替代资源,提供阅读资源。
继续阅读有关:
意图和意图过滤器
有关如何使用的意图API来激活应用程序组件,如活动和服务,以及如何使供其他应用程序使用你的应用程序组件的信息。
活动
有关如何创建活动类,它提供了一个独特的屏幕与用户界面应用程序的实例的信息。
提供资源
如何Android应用从应用程序代码,包括如何为特定设备配置提供备用资源,以构建单独的应用程序资源的信息。
你可能也有兴趣:
设备兼容性
关于Android的信息适用于不同类型的设备,并介绍了如何可以优化您的应用程序为每个设备或限制您的应用程序可用性到不同的设备。
系统权限
关于Android如何限制应用程序访问某些API使用许可制度,要求用户同意你的应用程序使用这些API的信息。