应用程序组件之APP基础(转官方)

英语是大问题 只能google 但google也是大问题 代码都给翻译了

应用基础

Android应用程序是用Java编程语言编写的。 Android的SDK工具编译代码连同任何数据和资源文件到一个Android包 ,归档文件.apk后缀。一个单一.apk文件中的所有代码被认为是一个应用程序是Android的供电设备用于安装应用程序的文件。

一旦安装在设备上,每个Android应用程序生活在它自己的安全沙箱:

  • Android操作系统是一个多用户的Linux系统中,每个应用程序是一个不同的用户。
  • 默认情况下,系统为每个应用分配一个唯一的Linux用户ID(ID只能由系统使用,是未知的应用程序)。 系统设置在应用程序中的所有文件的权限,所以只有用户ID分配给该应用程序可以访问它们。
  • 每个进程都有自己的虚拟机(VM),因此应用程序的代码运行在隔离从其他应用程序。
  • 默认情况下,每一个应用程序运行在自己的Linux进程。 Android的启动任何应用程序的组件时需要执行的过程,然后关闭进程时,它不再需要,或者当系统必须恢复内存供其他应用程序。

在这种方式中,Android系统实现了最小特权原则 。 也就是说,默认情况下,每个应用程序只能访问组件,它需要做其工作,并没有更多的。这将创建一个非常安全的环境中的应用程序不能访问部分的系统,这就是它没有获准。

不过,也有应用程序与其他应用程序共享数据和应用程序访问系统服务的方式:

  • 安排两个应用程序共享相同的Linux用户ID,在这种情况下,他们能够访问对方的文件,这是可能的。 为了节省系统资源,应用程序使用相同的用户ID,也可以安排在相同的Linux进程中运行,并共享相同的VM(应用程序也必须使用相同证书签署)。
  • 应用程序可以请求权限访问设备数据,比如用户的联系人,短信,安装存储(SD卡),摄像头,蓝牙,多。 所有应用程序必须被授予权限的用户在安装时。

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

  • 核心构架组件,您的应用程序定义。
  • 舱单申报文件,在其中的组件和功能,为您的应用程序所需的设备。
  • 资源,从应用程序代码分开,并让您的应用程序优雅地为各种设备配置优化其行为。

应用程序组件


应用组件是一个Android应用程序的基本构建块。 每个组件都是一个不同的角度,通过该系统可以进入您的应用程序。 并非所有组件都为用户的实际入口点和一些互相依赖的,但每一个作为自己的实体存在,起着特定的角色,每个人都是独特的建筑块,有助于确定你的应用程序的整体行为。

有四种不同类型的应用程序组件。 每种类型提供不同的目的,并具有明显的生命周期定义组件如何创建和销毁。

这里有四种类型的应用程序组件:

活动
一个活动表示一个单一的屏幕上的用户界面。  例如,电子邮件应用程序可能有一个活动,显示新的电子邮件列表,另一个活动,撰写电子邮件,阅读电子邮件和其他活动。  虽然活动携手合作,形成一个有凝聚力的电子邮件应用程序中的用户体验,每一个都是独立的。  因此,不同的应用程序可以从这些活动的任何一个(如果电子邮件应用程序允许的话)。  例如,一个摄像头的应用程序可以从构成新邮件的电子邮件应用程序中的活动,为了使用户共享图片。

实施的一项活动作为Activity的一个子类,你可以学习更多关于它的活动开发人员指南。

服务
服务是一种在后台运行的组件来执行长时间运行的操作或执行对远程进程的工作。  一个服务不提供用户界面。  例如,一个服务可以在后台播放音乐,而用户在不同的应用程序,或者它可能通过网络获取数据,而不阻塞用户交互与活动。  另一个组成部分,比如一个活动,可以启动该服务,并让它运行或绑定到它,为了与它进行交互。

实现一个服务作为Service的一个子类,你可以学习更多关于它的服务开发指南。

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

内容提供商也可用于读取和写入数据,您的应用程序的私有,而不是共享。 例如, 记事本示例应用程序使用一个内容提供商保存笔记。

内容提供商实现ContentProvider一个子类,并实施了一套标准的API,使其他应用程序来执行交易。 欲了解更多信息,请参阅内容提供商开发指南。

广播接收机
广播接收器是一个组件,全系统广播通知。  许多广播系统源于例如,广播宣布,显示屏已经关闭,电池低,或图片被抓获。  应用程序也可以启动广播,例如,让其他应用程序知道某些数据已经被下载到设备上,可供他们使用。  虽然广播接收机不显示用户界面,它们可以创建一个状态栏通知广播事件发生时,以提醒用户。 然而,更常见的是,广播接收器仅仅是“网关”到其他组件的目的是做一个非常小的量的工作。  例如,它可能会启动服务执行基于事件的一些工作。

BroadcastReceiver一个子类的广播接收机被实现为每个广播交付一个Intent对象。 欲了解更多信息,请参阅BroadcastReceiver类。

Android系统设计的一个独特的方面是,任何应用都可以启动其他应用程序的组件。 例如,如果你希望用户与设备摄像机拍摄照片,有可能是另一个应用程序,这是否和您的应用程序可以使用它,而不是发展自己拍摄照片的活动。 您不需要将或从相机应用程序,甚至连结到代码。 相反,你可以简单地启动相机应用程序中的活动,拍摄照片。 完成后,照片甚至是返回到您的应用程序,所以你可以使用它。 对于用户来说,它好像相机实际上是一个应用程序的一部分。

当系统启动时的一个组件,它该应用程序的启动过程(如果它尚未运行)和组件需要实例化的类。 例如,如果您的应用程序启动相机应用程序中的活动,拍摄照片,该活动运行的过程中,属于相机的应用程序,而不是在你的应用程序的过程。 因此,不像其他大多数系统上的应用程序,Android应用程序不会有一个单一的入口点(有没有main()函数,例如)。

由于系统运行的每个应用程序访问其他应用程序与文件的权限限制在一个单独的进程,您的应用程序不能直接激活从另一个应用程序的一个组成部分。 Android系统,但是,可以。 因此,激活另一个应用程序中的一个组成部分,必须传达一个信息系统,指定你的意图来启动某个特定组件。 然后系统会激活你的组件。

激活组件

三四个组件类型活动,服务,广播接收器被激活的异步消息称为意图 。 意图结合彼此在运行时(你可以认为他们的使者,要求来自其他组件的动作),各个组件组件是否属于您的应用程序或另一个。

的意图是建立一个Intent对象,它定义了一个消息,来激活一个特定的组件或一种特定类型的组件的意图可以是明确的或隐含的。

对于活动和服务,意图定义了要执行的操作(例如,“查看”或“送”的东西)和指定的URI数据行事(除其他事项外,该组件被启动,可能需要知道)。 例如,意图传达的活动,来显示图像,或打开一个网页请求。 在某些情况下,你就可以开始活动,收到结果,在这种情况下,活动也返回结果在一个Intent (例如,您可以发出意图让用户选择一个个人接触和它退还给您返回意图包括给选择的联系人的URI指向)。

对于广播接收器,其目的仅仅定义公布的广播(例如,指示的移动设备的电池电量低的广播只包括公知的行动,该值指示“电池电量低”的字符串)。

其他组件类型,内容提供商,没有被激活的意图。 相反,它被激活时,由一个请求从一个ContentResolver对象。 内容解析与内容提供者处理所有直接交易的,这样的组件,执行与供应商的交易并不需要,而是ContentResolver对象上调用方法。 这留下了内容提供商和组件请求信息(出于安全考虑)之间的抽象层。

激活每种类型的组件有不同的方法:

如需使用意图的更多信息,请参阅意图和意图过滤器文件。 关于激活特定组件的更多信息,也提供下列文件: 活动 , 服务 , BroadcastReceiver 内容提供商 。

清单文件


Android系统可以启动一个应用程序组件之前,系统必须知道该组件存在阅读应用程序的AndroidManifest.xml文件中(“清单”文件)。 在这个文件中,您的应用程序必须申报其所有组件,它必须是在应用程序项目目录的根目录下。

除了声明应用程序的组件,如清单做了一些事情:

  • 确定应用程序需要任何用户的权限,如上网或读访问用户的联系人。
  • 声明的基础上,应用程序使用哪些API应用程序所需的最低API级别 。
  • 声明使用或需要的应用程序,如摄像头,蓝牙服务,或者多点触摸屏的硬件和软件功能。
  • API库的应用程序需要链接(以外的Android框架API),如谷歌地图库 。
  • 而更多的

声明组件

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

 <?XML版本=“1.0”编码=“UTF-8”?
 <清单...  >
     <应用程序的Andr​​oid版本:图标=“@绘制/ app_icon.png”......  >
         <活动机器人:名称=“com.example.project.ExampleActivity”
                  机器人:标签=“@串/ example_label的”...  >
         </活动>
         ...
     </>
 </清单> 

在的<application>元素android:icon属性点资源标识的应用程序的图标。

<activity> android:nameActivity android:label <activity>元素, android:name属性指定Activity子类,并在android:label的完全限定类名称android:label属性指定一个字符串使用用户可见的活动标签。

你必须申报所有应用程序组件是这样的:

活动,服务和内容提供商,你包括你的源代码,但不申报清单中的系统是不可见的,因此,永远无法运行。 然而,广播接收器可以在清单中声明或在代码中动态创建(作为BroadcastReceiver对象)通过调用registerReceiver()并在系统中注册。

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

声明组件的能力

如上所述, 激活组件 ,你可以使用Intent开始活动,服务和广 ​​播接收器。 你可以这样做明确命名目标组件(使用组件类名)的意图。 然而,真正的意图在于权力的意图行动的概念。 意图行动,你只需描述要执行的操作类型(以及可选的数据后,你想执行的动作),并允许系统在设备上可以执行的行动,并开始查找组件。 如果有多个组件可以执行所描述的意图的动作,然后,用户选择要使用哪一个。

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

当你声明你的应用程序的清单中的一个组件,你可以选择包括意向申报功能的过滤器组件,因此它可以从其他应用程序的意图。 你可以声明一个意图过滤器为您的组件,通过添加组件的声明元素作为一个孩子一个<intent-filter>元素。

例如与活动组成一个新的电子邮件,电子邮件应用程序可能宣布在其清单条目意图过滤器,以应对“送”的意图(以发送电子邮件)。 可以在你的应用程序中的活动,然后创建一个意图“发送”的动作( ACTION_SEND ),该系统相匹配的电子邮件应用程序的“送”活动,并启动它时,你startActivity()调用的意图。

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

声明的应用需求

搭载Android的设备有很多种,不是所有的人提供相同的功能和能力。 为了防止您的应用程序被安装在您的应用程序所需要的功能的设备缺乏,这一点很重要,你清楚地定义manifest文件中声明设备和软件要求您的应用程序支持的设备类型的配置文件。 这些声明的大多是信息系统不读,但外部服务,如谷歌播放不读他们,以便为用户提供过滤搜索时,他们从他们的设备的应用。

例如,如果你的应用程序需要一个摄像头,并使用在Android 2.1推出了( API 7  )的API ,你应该声明这些manifest文件中的要求。 这样一来, 没有一个摄像头和一个Android版 ​​本低于 2.1的设备不能安装应用程序从谷歌播放。

但是,您也可以宣布你的应用程序使用相机,但并不需要它。 在这种情况下,您的应用程序在运行时必须进行检查,以确定设备是否有一个摄像头并禁用任何使用相机的功能,如果一个人不。

以下是为您设计和开发你的应用程序,你应该考虑的一些重要设备的特性:

屏幕大小和密度
为了分类的Andr​​oid设备的屏幕类型,为每个设备定义了两个特点:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(物理密度的像素在屏幕上,或dpi每英寸点数)。  为了简化各种不同类型的屏幕配置,Android系统推广到选择的群体,使他们更容易的目标。

屏幕大小:小,正常,大,特大型。 
屏幕密度:低密度,中密度,高密度和超高密度。

默认情况下,你的应用程序是兼容所有的屏幕尺寸和密度,因为Android系统作出适当调整你的UI布局和图像资源。 然而,你应该建立专门的布局一定的屏幕尺寸,并提供专门的图像一定的密度,使用替代布局资源,并宣布在你的清单到底是哪屏幕尺寸你的应用程序支持与<supports-screens>元素的。

欲了解更多信息,请参阅支持多种屏幕文件。

输入配置
许多器件提供了一个不同类型的用户输入机制,例如硬件键盘,轨迹球,或五向导航键。  如果你的应用程序需要一种特殊的输入硬件,那么你应该宣布它在你的清单与<uses-configuration>元素。  然而,应用程序应该是罕见的,需要一定的输入配置。
设备功能
有很多的硬件和软件功能,可能会或可能不存在一个给定的Andr​​oid设备,如摄像头,光线感应器,蓝牙,某些版本的OpenGL,或保真度的触摸屏。  你永远不应该承担一定的特点是可在所有Android的供电设备(比标准Android库的可用性),所以你应该申报与<uses-feature>元素应用程序使用的任何功能。
平台版本
不同的Andr​​oid平台的设备通常运行不同版本的Andr​​oid平台,如Android 1.6或Android 2.3。  每个后续版本通常包含在以前的版本不提供额外的API。  为了表示一套API,每个平台版本指定API级别 (例如,Android 1.0和Android 2.3的API等级1 API等级9)。  如果您使用任何被添加到1.0版本以后的平台的API,这些API被引入使用<uses-sdk>元素,你应该申报的最低API级别。

重要的是,你声明你的应用程序的所有要求,因为,当你发布你的应用程序在Google播放,店里使用这些声明来过滤每个设备上可用的应用程序。 因此,您的应用程序应该是只提供给设备,以满足您的应用需求。

对于谷歌如何玩这些(和其他)的要求的基础上的过滤器应用的更多信息,请参阅谷歌播放文件的过滤器 。

应用程序资源


Android应用程序是多人组成的代码,它需要从源代码是独立的资源,如图像,音频文件,以及任何有关应用程序的视觉呈现。 例如,你应该定义动画,菜单,样式,颜色和活动的用户界面的布局XML文件。 使用应用程序资源,可以很容易地更新您的应用程序,而无需修改代码,并通过提供一组替代资源的各种特性,使您能够优化你的应用程序,为各种设备配置(如不同的语言和画面尺寸)。

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

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

Android支持多种不同的预选赛替代资源。 为了定义设备配置应使用这些资源,包括资源目录的名称,限定符是一个简短的字符串。 再举一个例子,你应该经常创造不同的布局,为您的活动,这取决于设备的屏幕方向和大小。例如,当设备屏幕在纵向(高),你可能会想是垂直的按钮布局,但是当屏幕处于横向(宽),按钮应水平对齐。根据方向改变布局,你可以定义两种不同的布局,并应用适当的预选赛,每个布局的目录名。 然后,系统将自动根据当前设备的方向施加适当的布局。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值