与其他系统应用程序不同,Android应用程序没有为应用程序提供一个单独的应用程序入口(如同没有mian方法)而是为系统依照需求实例化提供了基本的组件,这就是我之后要讲到的Android的四大组件和另一个重要组件。
一、四大组件:
Activity(活动)组件——为用户操作而展示的可视化界面的组件
Activity是一个可视化界面,就拿我们手机最常用的QQ应用程序来说,有查看消息的界面,有联系人界面,有动态界面等等,尽管这些界面一起组成一个内聚的用户界面,但是每个Activity都是与其他的Activity保持的独立关系,每个都是以Activity类为基类的子类实现。
一个应用程序可以只有一个Activity也可以有多个Activity,每一个Activity的作用以及个数都是有应用程序和其设计所决定的。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的(如QQ的消息界面)。从一个activity 转向另一个的方式是靠当前的activity启动下一个。
每个activity 都被给予一个默认的窗口进行绘制。一般情况下,这个窗口是满屏的,但它也可以是一个
小的位于其它窗口之上的浮动窗口。窗口显示的可视内容是由一系列视图构成的,这些视图均继承自View 基类。。每个视图均控制着窗口中一块特定的矩形空间。父级视图包含并组织它子视图的布局。叶节点视图(位于视图层次最底端)在它们控制的矩形中进行绘制,并对用户对其直接操作做出响应。所以,视图是activity 与用户进行交互的界面。
Service(服务)组件——无可视化界面,在一段时间在后台运行的组件
无可视化的用户界面,而是在一段时间内在后台运行。这个与我们电脑里的任务管理器中的服务是一回事的,而在Android应用程序中我们最常见的是在后台播放歌曲中。每个服务都继承自Service 基类。
你可以连接至(绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开放。
如同activity 和其它组件一样,服务运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何干扰,它们一般会派生一个新线程来进行一些耗时任务(比如音乐回放)。
BroadcastReceiver(广播接收器)组件——一个专注于接收广播通知信息,并做出对应处理的组件
广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver 基类。
广播接收器没有用户界面。然而,它们可以启动一个activity 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
ContentProvider(内容提供者)组件——将一些特定的应用程序数据供给其它应用程序使用的组件
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite 数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个ContentResolver 对象,调用它的方法作为替代。
ContentResolver 可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。
二、另一个重要组件:
Intent(激活)组件——内容提供者被激活后将其他三种组件激活的组件
当接收到ContentResolver 发出的请求后,内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent 的异步消息所激活。intent 是一个保存着消息内容的Intent 对象。对于activity 和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI (统一资源标识符)和其它一些信息。比如说,它可以承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent 对象指明了声明的行为。比如,它可以对所有感兴趣的对象声明照相按钮被按下。
三、Intent对每个组件的激活方法
1、Intent激活Activity的方法
通过传递一个Intent 对象至Context.startActivity()或Activity.startActivityForResult()以载入(或指定新工作给)一个activity。相应的activity 可以通过调用getIntent() 方法来查看激活它的intent。Android 通过调用activity 的onNewIntent()方法来传递给它继发的intent。
一个activity 经常启动了下一个。如果它期望它所启动的那个activity 返回一个结果,它会以调用
startActivityForResult()来取代startActivity()。比如说,如果它启动了另外一个activity 以使用户挑选一张照片,它也许想知道哪张照片被选中了。结果将会被封装在一个Intent 对象中,并传递给发出调用的activity 的onActivityResult() 方法。
2、Intent激活service的方法
通过传递一个Intent 对象至Context.startService()将启动一个服务(或给予正在运行的服务以一个新的指令)。Android 调用服务的onStart()方法并将Intent 对象传递给它。
与此类似,一个Intent 可以被调用组件传递给Context.bindService()以获取一个正在运行的目标服务的连接。这个服务会经由onBind() 方法的调用获取这个Intent 对象(如果服务尚未启动,bindService()会先启动它)。比如说,一个activity 可以连接至前述的音乐回放服务,并提供给用户一个可操作的(用户界面)以对回放进行控制。这个activity 可以调用bindService() 来建立连接,然后调用服务中定义的对象来影响回放。
3、Intent激活BroadcastReceiver的方法
应用程序可以凭借将Intent 对象传递给Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它类似方法来产生一个广播。Android 会调用所有对此广播有兴趣的广播接收器的onReceive()方法,将intent 传递给它们。