详解Android四大组件

Android四大组件是安卓开发中非常基础并且非常重要的模块之一,它们分别是activity(活动:用户交互窗口)、service(服务:后台运行的事物)、content provider(内容提供者:提供数据给其他程序获取或存储)、broadcast receiver(广播:接收或监听外部信息)

一、activity
(1) activity是一个单独的窗口,是用来实现和用户交互的界面
(2) activity之间的通讯依赖intent,并且可以携带返回值
(3) 使用activity必须在AndroidManifest.xml文件中进行注册,否则程序不会识别和执行activity(程序会报错)

二、service
(1) service是在后台默默的完成用户指定的操作的,像下载、听音乐、后台播放等。service分为两种:
(a) started(启动式):通过其他组件调用startService()方法启动服务时,service处于started状态
(b) bound(绑定式):通过其他组件调用bindService()方法绑定到服务时,该服务处于bound状态
(2) 启动式服务和绑定式服务的区别:
(a) 通过startService()启动的服务的生命周期与启动它的组件无关,可以在给后台无限期运行,即使组件被摧毁,除非调用stopSelf()方法或者通过组件调用stopService()方法结束,并且此种方式启动服务会回调onStartCommand()方法
(b) 通过bindService()方法开启的服务会与开启它组件绑定在一起,一旦调用者退出,服务也随之结束,不求同生,只求同死的意思
(3) service也必须像activity一样在配置文件里面说明,用
(4) service通常是后台运行的,所以没有图形界面,Service组件需继承自基类Service,一般用于为其他组件提供后台服务或监听其他组件的运行状态

三、content provider
(1) android 提供了content provider使其指定的应用集数据提供给其他应用程序,其他程序可以通过ContentResolver类从该类容提供者中读取或者保存数据
(2) 只有在几个应用程序需要有数据共享时才有数据提供者,比如通讯录会被多个应用程序共享数据,而且数据必须存储在一个内容提供者中,这样的好处是统一数据访问方式
(3) ContentProvider实现数据共享,ContentProvider用于获取和保存数据,将数据分享给其他应用可见,这是不同应用间实现数据共享的唯一方式,因为安卓并没有提供所有应用共同访问的公共存储区
(4) 开发人员一般不会直接操作ContentProvider的对象,一般通过ContentResolver对象实现对ContentProvider的操作
(5) ContentProvider使用URI来唯一标志其数据集,这里的URI以content://开头,表示该数据由ContentProvider来管理

四、broadcast receiver
(1) 应用可以使用它对外部事件进行过滤,只接受感兴趣的外部事件(比如来电),广播接收器也没有图形界面,但是它们可以启动一个activity或service来响应接收到的事件,或者通过NotificationManager通知用户,通知可以用很多种方式引起用户的注意力,比如闪光,震动,播放声音等,一般会在状态栏放一个持久的图标,用户可以打开图标并获取消息
(2) broadcast receiver有程序动态注册和AndroidManifest静态注册两种注册方式
(3) 通过程序动态注册的广播接收器,只要用来注册它的activity被关闭,广播也跟随着失效了,但是静态注册的广播接收器,无论广播是否被关闭,广播接收器都是打开着的,也就是说只要设备开启着,就算app未开启,该app订阅的广播收到消息触发时也会对它起作用

小结:
(1) 四大组件的注册:
四大组件都必须进行注册才能被程序识别,而广播接收器分静态注册(在AndroidMenifest.xml中声明)和动态注册(通过创建和调用contex.registerReceiver()注册),静态注册的广播是不受程序影响的,即只要系统开启了广播就处于活跃状态(即使程序未开启)
(2) 四大组件的激活:
内容提供者的激活:当收到ContentResolver发出的请求时内容提供者被激活,其他三大组件被另一种叫intent的异步消息所激活
(3) activity栈(安卓的任务)
(a) Android中的任务其实就是activity的栈模式,它由一个或多个activity组成,栈底的是启动任务的activity,栈顶的是当前可以与用户交互的activity,当一个activity启动另一个新的activity的时候,新的activity就会被压入栈,成为当前运行的activity,前一个activity仍然保存在栈中,当用户按下back键回退时当前activity出栈,前一个activity恢复为运行状态,栈中保存的其实是对象,而栈内的activity永远不回重排,只会被压入或弹出
(b) 安卓任务(activity栈)中的所有activity是作为一个整体进行移动的,可以移动到前台,或者退至后台

你可能感兴趣的:(详解Android四大组件)