转载请标明出处: http://blog.csdn.net/zhangxingping

Android应用程序都是用Java语言编写的。AndroidSDK工具会把代码以及相关的数据和资源文件编译成Android包,也就是后缀为.apk的文档。一个.apk文件就是一个应用程序,并且是android系统安装改程序的安装文件。

一旦安装成功,应用程序就处于自己的安全沙盒中:

  • Android操作系统是一个多用户的Linux系统,其中每一个应用程序就是一个不同的用户。
  • 缺省情况下,系统会给每一个应用程序分配一个单独的Linux用户ID(该ID只能被系统感知,应用程序是不感知该ID的)。系统会给该程序中的所有文件进行访问权限设置,以便只有用户ID和该程序的ID一样的用户才可以访问这些文件。
  • 每一个进程都有自己的虚拟机,因此每个程序的代码运行都是和其它程序分开的。
  • 缺省情况下,每一个程序都是在自己的Linux进程中运行。Android系统会在该程序的任何一个部件需要执行的时候启动该进程,并在不需要的时候或者是系统需要为别的程序收复内存的时候关闭该进程。

因此,Android系统遵循最小权限原则。也就是说,缺省情况下,每一个应用程序只能访问自身完成工作所需的部件,而不能访问其它别的部件。这就创建了一种非常安全的环境,其中,应用程序是不能访问未经授权的系统部件的。

然而,系统提供了多种应用程序间共享数据和程序访问系统设备的方式:

  • 可以为两个应用程序指定相同的Linux用户ID,此时,这两个应用程序间是可以互相访问对方的文件的。为了节约系统资源,拥有相同的用户ID的应用程序可以在同一个Linux进程中运行,并共享同一个VM(应用程序必须拥有相同的认证)。
  • 应用程序可以请求用户的许可来访问诸如用户的通讯录,短信,SD卡,摄像头,蓝牙等的设备数据。这些许可必须在安装应用程序的时候得到用户的确认。

上面描述到的是应用程序如何存在于系统中的基础知识。该文档的剩下部分将介绍:

  • 应用程序中的核心框架部件。
  • 应用程序的清单文件(manifest文件)。它是声明程序部件和所需的设备特性的地方。
  • 资源。它是和程序代码分开的,可使程序在各种配置的设备上都能良好运行。

应用程序部件

————————————————————————————————————————————————————————————————————————————

应用程序部件是Android程序的重要组成部分。每一个部件都是系统可以进入应用程序的一个入口点。并非所有的部件都是为了让用户能够进入程序的。有些部件之间是相互依赖的。但是,每一个部件都是作为一个独立的实体存在的,并扮演着特定的角色——每一个部件都是一个独特应用程序的组成块,帮助我们来定义整个应用程序的行为。

Android应用程序中有四种不同类型的部件。每种类型的部件都有着独特的设计目的和生命周期。生命周期中定义了部件是如何被创建和销毁的。

以下就是这四种应用程序部件:

Activities活动

一个活动代表的就是有用户接口的一个“屏幕”。例如,电子邮件程序中可能会使用一个Activity来显示信邮件列表,而使用另外一个Activity来编写电子邮件,又使用别的Activity来阅读电子邮件。尽管这些活动在应用程序中一起工作,相互配合来完成很好的用户体验,但其本身则是相互独立的。这样一来,应用程序是可以随时启动其中的任何一个活动的。例如,照相机程序是可以启动电子邮件程序中的活动来编辑新的电子邮件,以便共享照片。

活动Activity的是作为Activity类派生来来实现的。在开发者指南中可以查阅到更多的关于Activities的信息。


Services服务

一个Service部件是在后台运行,进行长时间操作或者是为远端进程开展工作的部件。一个服务并不提供用户接口。例如,一个服务可以用来播放背景音乐,而此时用户可能在使用另外的应用程序,或者一个服务可用于从网络上获取数据而程序不用暂停用户和活动的交互。Activity可以启动服务并让之运行,或者是与之进行绑定以便和其进行交互。

一个服务是作为类Service的派生类来实现的。在开发者指南中可以查阅更多关于Service的信息。


ContentProvider内容提供者

一个Contentprovider是用来管理应用程序共享的数据集。数据可以被存储在文件系统中,或者是一个SQLite数据库中,或者是网页中,或者是任意其它应用程序可访问到的的永久性存储介质中。通过contentprovider,其它程序可以查询甚至修改共享的数据(如果contentprovider允许的话)。例如,Android系统中提供了一个contentprovider来管理用户的通讯录。这样一来,任何经过正确授权的程序都可以查询其中的数据,并对其中某条通讯录进行读写操作。

Contentprovider还可以用于读写程序的私有数据而非共享数据。例如,NotePad示例程序就是使用contentprovider来存储备忘录的。

一个contentprovider是作为ContentProvider类的派生类来实现的,并且必须实现标准的API集,以便能够和其它程序进行事务处理。在开发者指南中可以查阅更多的关于ContentProvider的信息。


Broadcastreceiver广播接收器

一个Broadcastreceiver是一个能对系统广播消息的宣告进行响应的部件。许多的广播消息都源自系统。比如,用于宣告屏幕被关闭的广播消息,用于宣告电池低电量的广播消息,或者是用于宣告照了一张相片的广播消息。应用程序也可以发起广播——比如,发起数据已经被下载完毕,并可用的广播,以便其它程序可以感知并响应该事件。尽管broadcastreceiver没有用户界面,但它可以在状态栏进行通知,以便让用户知道广播事件发生的时间。更常见的是,广播接收器是作为通往其它程序部件的大门,其中通常只做少量的工作。比如,广播接收可能只是启动一个服务来完成基于该事件的某些工作。

一个broadcastreceiver是作为BroadcastReceiver类的派生来来实现的,其中的广播都是通过Intent对象来分发的。更多信息,请参阅BroadcastReceiver类。


Android系统中一个很独特的一点就是任何程序都可以启动别的程序的部件。例如,如果你想让用户使用摄像头来拍摄一张照片,很有可能另外的应用程序已经有这样的功能了,我们的程序可以直接使用,而不用自己开发一个活动来从摄像头获取一张照片。甚至我们都不用把完成该功能的程序的代码和我们的代码合在一起。我们只需要简单地启动另外程序的这个活动来获取照片即可。当活动完成时,获取的照片就会被返回到我们的程序中,供我们使用。对于用户来说,摄像头就好像是我们程序的一部分一样。

当系统启动了一个部件,同时也就启动了部件所在的应用程序的进程,并对所需的部件类进行了实例化。例如,如果我们的程序中启动了用来获取图片的照相机程序中的活动,那么该活动是运行在照相机程序所对应的进程中的,而不是在我们自己程序的进程中的。因此,与其它大多数系统中的应用程序不同,Android应用程序并不是只有一个入口点(比如,没有main()函数)。


由于每一个程序是在独立的进程中运行的,并且限制了其它程序对该程序的文件访问,因此我们不能直接从我们的程序中来启动别的程序的活动。然而,Android系统是可以激活别的程序中的活动的,我们必须向系统发送消息,阐明我们想要启动特定活动的意图(intent)。系统就会为我们启动该活动。


激活部件

应用程序的四种部件中有三个都是通过叫做intent异步消息来被激活的。Intents把单独的部件和运行时的其它部件结合在一起(我们可以把intents想像成是用于向别的部件请求动作的消息器),而不管这些部件是属于哪个程序。


一个intent就是一个Intent对象。他定义了用来描述需要激活指定的部件或者是指定类型的部件的消息——一个intent可以是明确指定的,也可以是隐式指定的。


对于活动和服务来说,一个intent就定义了需要进行的操作(比如,想要呈现(view)或者是发送(send)某些事情))及其该操作所需的数据的URI(也就是启动该活动是所需的其它东西)。例如,可以有intent来请求一个活动显示一张图片或者是打开一个网页。在某种情况下,我们需要启动一个活动并获取其结果,此时,活动也是可以通过intent来返回其结果的(例如,我们可以请求一个intent来让用户选择一条通讯录并将之返回给我们——其返回的intent中就包含有一个指向被选择的通讯录的URI)。


对于broadcastreceiver来说,intent仅仅是定义了被广播的事件(例如,一个广播来表示设备处于低电量状态了的intent仅仅只包含了一个动作字符串来表示“电量低”)。


别的部件类型,contentprovider,并不是由intent来激活的,而是由来自ContentResolver的请求激活的。内容解析器(Contentresolver)负责处理与内容提供者相关的所有直接事务,以便让与内容提供者进行事务交易的部件不必调用ContentResolver对象的方法。这就在内容提供者和请求内容的部件之间提供了一个抽象层。


激活各种部件的方法也不尽相同:

l通过调用startActivity(),并为其传入一个Intent,我们就可以启动一个活动,或者是在需要活动返回结果的时候调用startActivityForResult()

l通过调用startService(),并为其传入一个Intent,我们就可以启动一个服务,或者是为其正在运行的服务发送新的指令。或者是可用通过调用bindService(),并为其传入一个Intent来和某个服务进行绑定。

l通过调用ContentResolverquery()方法,我们可以完成对其的一次查询。


更多关于intents的信息请参阅IntentsandIntentFilters文档。更多关于如何激活指定部件的信息请参阅如下的文档:Activities,Services,BroadcastReceiver以及ContentProviders


更多相关文章

  1. android 电容屏(三):驱动调试之驱动程序分析篇
  2. Android应用程序的debug属性
  3. android应用程序键盘事件机制
  4. Android之路——第二个Android小程序(Android短信发送)
  5. Android官方入门文档[2]运行你的应用程序
  6. android应用程序签名问题
  7. Android应用程序框架
  8. Android Email程序源码

随机推荐

  1. Launcher
  2. android各种声音类型级数设定及默认值
  3. Android P WMS初始化过程
  4. Android中判断网络连接的工具类
  5. android获取应用基本信息
  6. Manage Android source code like source
  7. Android下获取设备唯一标识(UDID, Device
  8. Android 面试题之基础(不断更新)
  9. Android碰到的问题之一
  10. 隐藏的数字咪咪