Android四大组件:Activity、Service、BroadCast Recevicer、Content provider
Activity
Activity是用户和应用程序交互的窗口,一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。一个activity相当于我们实际中的一个网页,当打开一个屏幕时,之前的那一个屏幕会被置为暂停状态,并且压入历史堆栈中,用户可以通过回退操作返回到以前打开过的屏幕。activity的生命周期:即“产生、运行、销毁”,但是这其中会调用许多方法onCreate(创建) 、onStart(激活) 、onResume(恢复) 、onPause(暂停) 、onStop(停止) 、onDestroy(销毁) 、onRestart(重启)。
Service
Service是运行在后台的一段代码,它可以运行很长的时间,相当于后台的一个服务。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Service)上面,通过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐依然可以继续播放,这时就是由服务 (service)来保证当用户界面关闭时音乐继续播放的。
Service是Android四大组件中与Activity最相似的组件,都可以代表可执行的程序。
Service与Activity的区别:
l Service一直在后台运行,没有用户界面。
l 一旦service被启动之后,就跟Activity一样。有自己的生命周期。所以可以没有Activity。
开发Service需要两个步骤:
l 定义一个继承Service的子类
l 在AndroidManifest.xml中配置该Service ,其过程和配置Activity一样。
Service运行有两种方式:
l 通过Context的startService()方法,通过该方法启动用Service,访问者与Service之间没有关联,即使访问者退出了,Service仍然运行。
l 通过Context的bindSerive()方法,使用该方法启用Service,访问者和Service形成关联,即绑定在一起,访问退出,Service也退出。
BroadCast Recevicer
Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。BroadCast Recevicer接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。可以使用BroadcastReceiver来让应用对外一个外部的事件作出响应。
Broadcast Receiver通过NotificationManager来通知用户这些事情发生了,BroadcastReceiver注册的有两种方式,一种是可以在AndroidManifest.xml中注册,另一种可以在运行时的代码中使用Context.registerReceiver()进行注册。用户还可以通过Context.sendBroadcast()将他们自己的intent broadcasts广播给其他的应用程序。
Broadcast Reciver本质是一种全局的监听器,它可以用来组件之间相互通信。它用来接收程序所发出的Broadcast intent,与应用启动Activity,Service相同的是:程序启动Broadcast Reciver也是需要两个步骤
l 创建Broadcast Reciver的Intent
l 调用context的sendBroadcast()或者sendorderBroadcast()方法来启动制定的BroadcastReciver
Content Provider
Content Provider即内容提供者,可通过它来共享自己的数据给外部调用,给第三方应用提供数据访问的接口。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Content Provider负责组织应用程序的数据和向其他应用程序提供数据。
Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。
让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类) 或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。
Content Provider 是如何向外界提供数据的:
Android提供了Content Provider,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据完全暴露出去,而且Content Providers是以类似数据库中表的方式将数据暴露,也就是说Content Provider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。至于如何从URI中识别出外界需要的是哪个“数据库”,这就是Android底层需要做的事情了,不在此详细说。简要分析下ContentProvider向外界提供数据操作的接口:
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
ContentProvider 是如何组织数据的:
组织数据主要包括:存储数据,读取数据,以数据库的方式暴露数据。数据的存储需要根据设计的需求,选择合适的存储结构,首选数据库,当然也可以选择本地其他文件,甚至可以是网络上的数据。数据的读取,以数据库的方式暴露数据这就要求,无论数据是如何存储的,数据最后必须以数据的方式访问。