android四大组件activity、service、contentprovider、broadcast receiver及枢纽intent

一、Activity

Activity是最基本的Android应用程序组件,应用程序中,一个Activity通常就是一个单独的屏幕。每一个Activity都被实现为一个独立的类,并且从Activity基类中继承而来,Activity类将会显示由视图控件组成的用户接口,并对事件做出响应。

大多数的应用是由多个屏幕显示组成。例如:一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕,第二个屏幕用来写文本消息和选择收件人,再来一个屏幕查看消息历史或者消息设置操作等。这里每一个这样的屏幕就是一个Activity,很容易实现从一个屏幕到一个新的屏幕并且完成新的Activity。在某些情况下当前的屏幕也许需要向上一个屏幕Activity提供返回值–比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像。当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。

默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。简单理解Activity代表一个用户所能看到的屏幕, Activity主要是处理一个应用的整体性工作,例如, 监听系统事件(按键事件、触摸屏事件等)、为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类, 该类是Android提供的基层类, 其他的Activity继承该父类后, 通过Override父类的方法来实现各种功能,这种设计在其他领域也较为常见。

二、Service

一个Service是一段长生命周期的,没有用户界面的程序。

比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个 activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行结束。

另外,我们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。当连接到一个 service之后, 我们还可以service提供的接口与它进行通讯。 拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作 。

三、ContentProvider

Android应用程序能够将它们的数据保存到文件、 SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供器就可以发挥作用了。

因为内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。数据是应用的核心。在Android中,默认使用鼎鼎大名的SQLite作为系统DB。但是在Android中,使用方法有点小小的不一样。在Android中每一个应用都运行在各自的进程中,当你的应用需要访问其他应用的数据时,也就需要数据在不同的虚拟机之间传递,这样的情况操作起来可能有些困难(正常情况下,你不能读取其他的应用的db文件), ContentProvider正是用来解决在不同的应用包之间共享数据的工具。

  • 所有被一个Android应用程序创建的偏好设置,文件和数据库都是私有的。
  • 为了和其他应用程序共享数据,应用程序不得不创建一个ContentProvider
  • 要回索其他应用程序的数据,它自己的ContentProvider必须被调用
  • Android 本地ContentProvider 包括:
    • CallLog:地址和接收到的电话信息
    • Contact.People.Phones:存储电话号码
    • Setting.System:系统设置和偏好设置
    • 等 等

四、BroadCastReceiver

主要用于接收系统或者app发送的广播事件,分为有序广播和无序广播。无序广播逻辑上可以同时被任何广播接受者接收到。有序广播同一时间只有一个广播接收者能收到,例如有三个广播接收者A,B,C, 优先级是A>B>C,只有当A的逻辑执行完后才能传给B。每个广播接收者都有权终止广播。

BroadcastReceiver有两种注册方法,在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册。广播接收者中不要做一些耗时的工作,也不要开辟线程。当onReceiver( )方法运行时间过长,那么程序会报错(ANR)。广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等。

五、Intent

调用Android专有类Intent进行架构屏幕之间的切换。 Intent是描述应用想要做什么。Intent数据结构两个最重要的部分是动作和动作对应的数据。典型的动作类型有:MAIN(活动的门户) 、 VIEW、 PICK、 EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看某个人的联系方式,你需要创建一个动作类型为VIEW的Intent,以及一个表示这个人的URI。

Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intentfilter则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时, 需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。 IntentFilter需要在AndroidManifest.xml 中 定义。通过解析各种 intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时, activity将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:
A、 Activities能够重复利用从其它组件中以Intent的形式产生的一个请求。
B、 Activities可以在任何时候被一个具有相同IntentFilter的新的Activity取代。