广播机制

1.      Android中的广播主要可以分为两种类型,标准广播和有序广播。

1)      标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。

2)      有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

2.      接受系统广播:Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。注册广播的方式一般有两种,在代码中注册(广播接收器)和在AndroidManifest.xml中注册,其中前者被称为动态注册,后者也被称为静态注册。

1)      动态注册:其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行。最后要记得,动态注册的广播接收器一定都要取消注册才行,这里我们是在onDestroy()方法中通过调用unregisterReceiver()方法来实现的。,Android系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则程序将会直接崩溃,比如这里查询系统的网络状态就是需要声明权限的。打开AndroidManifest.xml文件,在里面加入如下权限就可以查询系统网络状态了:”<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>”

2)      静态注册:动态注册的缺陷是必须要在程序启动后才能接收到广播,因为注册的逻辑是写在onCreate()方法中。静态注册可以实现让程序在未启动的情况下就能接收到广播。让程序接收一条开机广播,当收到这条广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。新建一个BootCompleteReceiver继承自BroadcastReceiver,然后在AndroidManifest.xml中将这个广播接收器的类名注册进去。<application>标签内出现了一个新的标签<receiver>,所有静态注册的广播接收器都是在这里进行注册的。

3)      注意:不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。

3.      发送自定义消息

1)      标准广播:在AndroidManifest.xml中对这个广播接收器和自顶一下消息进行注册,然后发送这样一条自定义消息即可。广播是一种可以跨进程的通信方式,这一点从前面接收系统广播的时候就可以看出来了。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。

2)      有序广播:注册方式和标砖广播一样,不过要设置接收器的优先级。发送有序广播只需要改动一行代码,即将sendBroadcast()方法改成sendOrderedBroadcast()方法。这个时候的广播接收器是有先后顺序的,而且前面的广播接收器还可以将广播截断,如果在onReceive()方法中调用了abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播。

4.      本地广播:主要就是使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。本地广播是无法通过静态注册的方式来接收的。其实这也完全可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。本地广播具有以下优点:

1)      明确知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄露问题。

2)      其他程序无法将广播发送到我们程序内部,因此不需要担心安全漏洞的隐患。

3)      发送本地广播比发送系统全局广播更加高效。

5.      注意:在广播接收器里启动活动的,因此一定要给Intent加入FLAG_ACTIVITY_NEW_TASK这个标志。最后,还需要把对话框的类型设为TYPE_SYSTEM_ALERT,不然它将无法在广播接收器里弹出。弹出了一个系统级别的对话框,因此必须在xml文件中要声明android.permission.SYSTEM_ALERT_WINDOW权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值