读书笔记(9) 四大组件的工作过程

这些读书笔记是根据《Android开发艺术探索》和《Android群英传》这两本书,然后将书上的一些知识点做一下记录。方便学习和理解,如果有存在侵犯版权的地方,还麻烦告知。个人强烈建议购买这两本书。真心不错。

本节是和《Android开发艺术探索》中的第9章 “四大组件的工作过程” 有关系,建议先买书查看这一章。

[]四大组件运行状态

Android 中的四大组件是:Activity,Service,BroadcastReceiver,ContentProvider。其中 BroadcastReceiver 既可以在AndroidMainfest.xml 中注册也可以通过代码在注册,其余的都必须在AndroidMainfest.xml 中注册。Activity,Service,BroadcastReceiver需要借助 Intent 来启动,而 ContentProvider 无须借助 Intent。

[]Activity

Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互。它扮演的是一种前台界面的角色。

Activity相关可以查看

读书笔记(1) Activity的生命周期和启动模式:
http://blog.csdn.net/u011975949/article/details/51535034

[]Service

Service是一种计算型组件。用于在后台执行一系列计算任务。

Service组件虽然是用于执行后台计算,但是它是运行在主线程的,因此耗时的后台计算仍然需要在单独的线程中去执行。

Service的启动有两种方式

startService:访问者与Service没有任何关联,即使访问者退出了,Service仍然运行。无法和访问者进行通信,交换数据。

startService()—>onCreate()—>onStartCommand()—>Service运行中—>stopService()—>onDestroy()

多次startService()只会有一个实例,onCreate()只会调用一次,但是onStartCommand()会调用多次,执行一次startService(),onStartCommand就会被调用一次。

bindService:访问者与Service绑定在一起,访问者一旦退出,Service也就终止。可以和访问者进行通信,交换数据。

bindService()—>onCreate()—>onBind()—>Service运行中—>unbindService()—>onUnbind()—>onDestroy()

多次bindService()只会有一个实例,onCreate()只会调用一次,但是onBind()也只会调用一次,多次执行bindService(),onBind()也只调用一次。

[]BroadcastReceiver

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。注册的方式有两种:静态注册和动态注册。

静态注册是指在AndroidMainfest.xml中注册,这种广播在应用安装时会被系统解析,这种形式的广播不需要应用启动就可以收到相应的广播。

动态注册需要通过Context对象的registerReceiver()来实现,并且在不需要时通过Context对象的unregisterReceiver()解除广播,这种广播必须要应用启动才能注册并接收广播。因为应用不启动就无法注册广播,无法注册广播就无法收到相应的广播。

BroadcastReceiver都是通过Context对象的sendBroadcast()发送无序广播或者sendOrderedBroadcast()发送有序广播。

BroadcastReceiver分为普通广播和有序广播

普通广播:几乎可以在同一时刻被所有的接收者收到,消息传递效率高,但是接收者不能将处理结果传递给下一个接收者。没有优先级,不能中断 。

有序广播:接收者将按预先声明的优先级依次接收广播。优先级高的先接收到广播,优先级低的后接收到。

优先级别声明在 < intent-filter >的android:priority=”“,也可以通过IntentFilter对象的setPriority()设置优先级别,数值越大优先级越高。取值范围为-1000~1000。

可以调用BroadcastReceiver对象的abortBroadcast()终止广播。如果广播被前面的接收者终止,后面的接收者就无法接收到广播。

优先级高的接收者可以通过BroadcastReceiver对象的setResultExtras()将数据存入广播中,然后传递给下一个接收者。下一个接收者可以通过BroadcastReceiver对象的getResultExtras()获取上一个接收者存入的数据。

BroadcastReceiver不能直接执行耗时的操作。因为BroadcastReceiver的生命周期只有10秒。如果要执行耗时操作也不能开子线程。因为一个进程中没有活动的四大组件,那么这么进程的优先级会非常低,会很容易被系统杀死。所以只能采用开启Service,然后在Service中利用子线程来执行耗时操作。

对于同一App内部发送和接收广播,将exported属性设置成false,使得非本App内部发出的此广播不被接收。

系统的广播:时间改变,接受短信,锁屏等。

[]ContentProvider

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。

ContentProvider的内部需要实现增删改查这四种操作,在它的内部维持着一份数据集合,这个数据集合可以是数据库来实现,也可以是其他任何类型来实现,比如:List,Map。

ContentProvider内部的insert(),delete(),update(),query()需要处理好线程同步,因为这几个方法是在Binder线程池中被调用。

ContentObserver对象监听ContentProvider数据的改变,如果数据发生改变,ContentObserver对象的onChange()会被调用。可以通过ContentResolver对象调用registerContentObserver()方法来注册一个ContentObserver对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值