一 Android是什么?   

      Android是包含操作系统、中间件和关键应用程序的适用于移动设备的软件集合。 Android SDK提供了使用 Java语言在Android平台上开发应用程序必要的工具和API。

      这是网上copy过来的原话,简洁明了。

 

二 Android应用程序的法则

     Android应用程序是用Java编程语言编写的。编译后的Java代码 —包括应用程序需要的任何数据和资源— 被aapt工具封装到Android包中,使用.apk后缀的包文件。该文件是发布和安装到移动设备的媒介;它是用户下载到他们的设备上的文件。在一个.apk文件中的所有代码就是一个应用程序。

个人理解:.apk文件相当于一个安装到手持设备的应用程序包。

 

    Android的一个核心特性是,一个应用程序可以使用其它应用程序的元素(那些应用程序可以提供的)。例如,你的应用程序需要显示一个图片的滚动列表,另外一个应用程序开发了适合的滚动组件并且允许其它应用程序使用它,那么你可以调用该组件来完成显示工作,不用自己再开发了。你的应用程序不需要合并代码或者链接到该程序。只是简单的在需要的时候启动其他应用程序的那部分即可。

    Android应用程序没有单一的入口点(比如说,没有main()函数)。它只实例化和运行必要的组件

    为了使该特性可用,系统必须能够在应用程序的任何一部分需要执行时启动应用程序进程,并实例化其Java对象。

    因此,提供了四种类型的组件:

(1)活动

    活动 为用户提供有焦点的可视用户界面。每个都作为实现了基类 Activity的子类。

    应用程序可以由一个活动构成,或者象刚刚提到的文本消息应用程序一样,可以包含多个活动。每个活动会被赋予一个缺省的绘制窗口。

    窗口的可视内容是由层次结构的视图提供的— 从基类 View派生的对象。每个视图控制着窗口中的一部分矩形区域。父视图容纳并组织其子视图的布局。叶视图(那些最底层的视图)在矩形中绘制内容,它们在该空间直接控制并响应用户的动作。就是说,视图是活动与用户交互的地方。例如,视图可以显示一幅图像,当用户碰了图像时执行一个动作。Android有一些现成的视图可以使用 —包括按钮、文本框、滚动条、菜单项、复选框等等。

   在活动的窗口中是通过函数 Activity.setContentView()设置视图的。内容视图是位于层次的根部的视图对象。

个人理解:活动就相当于一个获得焦点的和用户交互的对象

(2)服务

服务没有可视用户界面,而是在后台无限期的运行。例如,服务可以在用户做其它事情时播放背景音乐,或者从网络上取得数据,或者做计算工作,然后返回活动需要的结果。每个服务都扩展自Service基类。

    个人理解:广播接收器就是一个消息响应函数

(4)内容提供者

     内容提供者生成一个提供给其它应用程序,可访问的数据集合。数据可以存储在文件系统中、SQLite 数据库中或者其它可以使用的任何形式。内容提供者通过扩展 ContentProvider基类,实现一套标准的方法,以使其它应用程序可以取得和存储它控制的类型的数据。不过应用程序并不调用这些方法。它们使用 ContentResolver对象来调用。 ContentResolver可以与任何内容提供者交互,它与提供者一起来管理复杂的进程间的通信。

    当有请求需要由应用程序的部分组件处理时, Android负责确保组件所属应用程序进程的运行,需要时会启动该进程;并保证组件的实例可用,在需要时创建实例。

个人理解:感觉这个组件和前面提到的“一个应用程序可以使用其它应用程序的元素(那些应用程序可以提供的)”有很大关联,应用程序要使用其他应用程序的元素时,通过ContentResolver对象按照ContentProvider提供的方法来调用其他应用的元素


三 组件的操作

(一)组件的激活

    内容提供者在被ContentResolver请求时激活。

    活动服务广播接收者— 通过叫做意图的异步的消息激活。

意图是一个 Intent 对象,它保持着信息的内容。对于活动和服务,它指明请求的动作,指定动作需要的数据的URI和其它内容。例如,它可以对活动发出一个请求,要求显示一幅图像或者让用户编辑一些文本。对于广播接收者,意图对象指明广播的动作。例如,它可以对感兴趣的接收者发出快门被按下的消息。

    还有其它方法来激活各种组件: 

  • 活动可以通过传递一个意图对象到 Context.startActivity() Activity.startActivityForResult()来启动(或执行新的动作)。做出响应的活动可以通过调用 getIntent()方法取得使其运行的意图。 Android调用活动的 onNewIntent()方法传递任何之后的意图。 一个活动经常启动另一个。如果它想得到它启动的活动的结果,它可以调用 startActivityForResult()来代替 startActivity()。例如,你启动了一个活动,让用户选择一幅照片,就需要它返回的选中的照片。结果通过调用活动时传入 onActivityResult()方法的意图返回。
  • 通过传递意图对象到 Context.startService()来启动服务(或者给正在运行的服务新的指令)。 Android调用服务的 onStart()方法,并传给它意图对象。
    同样的,可以将意图传递给 Context.bindService()来建立调用组件和目标服务之间的连接。服务会在 onBind()被调用时收到意图对象。(如果服务没有运行 bindService()会启动它。) 例如,活动可以与刚才提到的音乐播放服务建立连接,以便是用户(通过用户界面)可以控制播放。活动将调用 bindService()来设置连接,之后调用定义的方法来控制播放。  
  • 应用程序可以初始化一个广播,通过传递一个意图对象到象 Context.sendBroadcast() Context.sendOrderedBroadcast()、和 Context.sendStickyBroadcast()的方法,并传入需要的变量。 Android传送意图到所有对它赶兴趣的广播接收者,通过调用它们的 onReceive()方法。

(二)组件的停止

      内容提供者只有在响应ContentResolver的请求时激活。广播接收者只有在它对广播的消息作出响应时激活。因此它们不需要显式的停止它们的组件。

      与之对应的,活动提供用户界面。它们在与用户的长期会话中,保持运行,无论空闲时还是会话中。与活动类似,服务也可以长时间保持运行。因此,Android有按顺序停止活动和服务的方法:

  • 活动可以通过调用它的 finish()方法来停止。一个活动可以停止另一个活动(由它通过, startActivityForResult()启动的),通过调用finishActivity()方法。
  • 服务可以通过调用它的 stopSelf()方法或Context.stopService()方法来停止它。

      组件也可能被系统停止,当它们不再使用时、或者Android为了活跃组件的运行,必须回收内存时。

最好的例子是媒体播放器根据播放列表来播放音乐。播放器会有一个或多个活动,允许用户选择和播放音乐。音乐播放本身当然不能由活动来完成,因为用户会希望在他离开播放器去做其它事情时,仍然可以让音乐继续播放。为了保持音乐播放,活动可以启动一个服务在后台运行。系统将保持音乐播放服务的执行,即使启动它的活动已经不在屏幕上了。

     连接(绑定)到一个正在运行的服务(如果它没有运行的话,就启动它)是可能的。连接上之后,你就可以通过服务提供的接口与它通信了。对于音乐服务,接口可能允许用户暂停、恢复、停止和重新开始播放。

象活动一样,其它组件、服务也在应用程序进程的主线程中运行。为了不阻断其它组件或用户界面,耗时的任务(比如播放音乐)经常会切换到其它线程。

个人理解:服务就是一个后台可并发执行的程序

(3)广播接收器    

     广播接收器 是一个不做什么实质性工作的组件,只是接收广播通知并对其作出反应。系统代码中有很多广播源 — 例如,通知时区变更、电池电量低、选择了一个图片或者用户更改了语言选项。应用程序也可以初始化广播, —例如,让其它应用程序知道,数据已经下载到设备并可以使用了。

     应用程序可以有任意数量的广播接收器,分别对有用的通知作出反应。所有的广播接收器都扩展自 BroadcastReceiver基类。

广播接收器不显示用户界面。它们可以启动活动来响应受到的信息,或者使用 NotificationManager来通知用户。通知可以通过多种方式引起用户的注意 — 背光闪烁、振动、播放音乐等等。典型地是在状态栏显示一个特定图标,用户可以打开它来取得信息。