Android(六)之内容提供者等、广播、service

一、内容提供者的工作原理

假设B程序需要操作A程序数据库中的数据,一般需要A程序使用ContentProvider暴露数据,才能被其他程序操作。B程序通过ContentResolver操作A程序暴露出来的数据,而A程序会将操作结果返回给ContentResolver,然后ContentResolver再将操作结果返回给B程序。

二、内容观察者的工作原理

使用ContentObserver观察A程序的数据时,首先要在A程序的ContentProvider中调用ContentResolver的notifyChange()方法。调用此方法后,当B程序操作A程序中的数据时,A程序会向“消息中心”发送数据变化的消息,此时C程序会观察到“消息中心”的数据有变化,会触发ContentObserver的onChange()方法。

三、Uri主要由三部分组成

  • scheme
  • authority
  • path

四、广播机制的实现过程

Android中的广播使用了观察者模式,即基于消息的发布/订阅事件的模式。广播发送者和接收者分别处于观察者模式中的消息发布和订阅两端。广播机制的实现过程具体如下:
(1)广播接收者通过Binder机制在AMS(Activity Manager Service)中进行注册。
(2) 广播发送者通过Binder机制向AMS发送广播。
(3) AMS查找符合相应条件(IntentFilter/Permission)的广播接收者,将广播发送到相应的消息循环队列中。
(4)执行消息循环时获取到发送的广播,然后回调广播接收者中的onReceive()方法并在该方法中进行相关处理。

五、有序广播和无序广播的区别

广播分为有序广播和无序广播,他们有以下几点的区别。
(1) 发送广播时,使用的方法不同。有序广播使用sendOrderedBroadcast()发送广播,而无序广播使用sendBroadcast()方法发送广播。

(2) 广播接收者执行的顺序
a)有序广播的接收者是顺序执行的。
有序广播按照广播接收者声明的优先级别被依次接收。当在高级别的广播接收者逻辑执行完毕之后,广播才会继续传递。当优先级相同时,先注册的广播接受者优先执行。
b)无序广播是完全异步执行的。
当发送无序广播时,所有监听这个广播的广播接收者都会接收到此广播消息,但接收和执行的顺序不确定。

(3)拦截广播
有序广播的接收者可拦截广播。如果优先级较高的广播接收者将广播终止,那么广播将不再向后传递。而无序广播则不能被拦截。

(4)效率
有序广播的效率比无序广播低。

六、Service的两种启动方式

Service的启动方式分别可以调用startService()、bindService()方法,这两个启动方式的区别如下所示:

(1) 生命周期
startService():使用该方法开启Service时,执行的生命周期方法依次为onCreate()、onStartCommand()、onDestroy()。

bindService():使用该方法开启Service时,执行的生命周期方法依次为:onCreate()、onBind()、onUnbind()、onDestroy()。

(2)停止服务的方法
startService():调用stopSelf()、stopService()方法停止服务。
bindService():调用unbindService()方法停止服务。

(3) 组件的关联
startService():当一个组件通过此方法开启服务时,服务与开启该组件没有关联,即使开启服务的组件被销毁,服务依旧运行。
bindService():当一个组件通过此方法开启服务时,服务会与该组件绑定,组件一旦被销毁,该服务也会被销毁。

七、Service的生命周期

使用不同的方式启动服务,其生命周期会不同。开启服务的方法分别为startService()、bindService(),当通过startService()方法启动服务时,执行的生命周期方法依次为onCreate()、onStartCommand()、onDestroy()。当通过bindService()方法启动服务时,执行的生命周期方法依次为onCreate()、onBind()、onUnbind()、onDestroy()。
其生命周期方法的具体含义如下:
(1)onCreate ():第一次创建服务时执行的方法。
(2)onStartCommand():调用startService()方法启动服务时执行的方法。
(3)onBind():调用bindService()方法启动服务时执行的方法。
(4)onUnbind():调用unBindService()方法断开服务绑定时执行的方法。
(5)onDestory():服务被销毁时执行的方法。

猜你喜欢

转载自blog.csdn.net/qq_55691371/article/details/128065774