Android体系复习---广播

一、广播简介

Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这些广播会在所关注的事件发生时发送。举例来说,Android 系统会在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。再比如,应用可以发送自定义广播来通知其他应用它们可能感兴趣的事件。

二、广播注册方式

自定义广播时我们只要继承BroadcastReceiver ,重写其onReceive方法即可

class CustomBroadCastReciver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        "接收到了广播".log()
    }
}
  1. 静态注册
    注册方式:在AndroidManifest.xml里通过<receive>标签声明
    属性说明:
<receiver 
    android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
//继承BroadcastReceiver子类的类名
    android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
    android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
    android:process="string" >
监听本地语言改变
 <receiver android:name=".CustomBroadCastReciver">
      <intent-filter>
          <action android:name="android.intent.action.BATTERY_CHANGED"/>
     </intent-filter>
</receiver>

注意: 因为Android高版本限制了很多隐式广播静态注册,许多例如网络变化,锁屏等系统广播用户app将接收不到。这里的语言改变广播不在此限制。此外官方文档提供的以下广播皆不在此限制(需要梯子,文末我会列出)。
https://developer.android.com/guide/components/broadcast-exceptions?hl=zh-cn

  1. 动态注册
    通过代码的方式设置intent-filter来添加其监听的方式为动态注册,动态注册可以监听一些被限制的静态广播,比如网络变化监听,代码如下
 val broadCastReciver = CustomBroadCastReciver()
 val intentFilter = IntentFilter()
//监听网络变化
 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
 registerReceiver(broadCastReciver,intentFilter)

注册完记得在合适的地方解注册

unregisterReceiver(broadCastReciver)

注意:动态广播最好在Activity 的 onResume()注册、onPause()注销。
在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

三、发送广播-广播的种类

1. 普通广播
普通广播发送的方式通过sendBroadcast方法发送,传递参数为intent,通过intent的action来匹配广播,接收注册时静态、动态两种方式均可以

注册:

//注册方式一:动态注册
val intentFilter = IntentFilter()
intentFilter.addAction("customBroadCast")
registerReceiver(broadCastReciver,intentFilter)

//注册方式二:静态注册
 <receiver android:name=".CustomBroadCastReciver">
            <intent-filter>
                <action android:name="customBroadCast"/>
            </intent-filter>
        </receiver>
val intent = Intent()
intent.setAction("customBroadCast")
//高版本必须要加,否则接收不到
intent.setComponent(ComponentName("com.czy.systemlearn","com.czy.systemlearn.CustomBroadCastReciver"))
sendBroadcast(intent)

2. 顺序广播
发送出去的广播被广播接收者按照先后顺序接收,先后顺序根据priority来决定
代码设置intentFilter.priority = 1
xml设置: <intent-filter android:priority="1">
Priority属性相同者,动态注册的广播优先;
通过sendOrderedBroadcast(intent);发送即可

特点:

  • 接收广播按顺序接收
  • 先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;
  • 先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播

3. 本地广播
Android 中的广播默认是跨app通信,而跨app通信就存在效率低且有安全隐患,如果开启广播的意图不需要跨app,我们则可以使用本地广播。LocalBroadcastManager不能静态注册,只能动态注册
优势
1.只能传输在App内部,不会被其他App接收,确保数据安全
2.接收不到其他App广播,免干扰
3.比BrocastReceiver更加高效

使用

  1. 注册
 val broadCastReciver = CustomBroadCastReciver()
val intentFilter = IntentFilter()
intentFilter.addAction("customBroadCast")
LocalBroadcastManager.getInstance(this).registerReceiver(broadCastReciver,intentFilter)
  1. 发送
val intent = Intent()
intent.setAction("customBroadCast")
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
  1. 解注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadCastReciver)

4. 系统广播
系统广播指的是,Android系统的一些状态发生改变时会向应用发送广播,比如开机,网络变化,电量变化,屏幕关闭打开等。
但是随着版本升级,越来愈多的系统广播被限制。下面是从官网介绍的版本改变更改
Android 7.0
Android 7.0(API 级别 24)及更高版本不发送以下系统广播:

Android 8.0
从 Android 8.0(API 级别 26)开始,系统对清单声明的接收器施加了额外的限制。

如果您的应用以 Android 8.0 或更高版本为目标平台,那么对于大多数隐式广播,您不能使用清单来声明接收器,只能使用动态注册。
目前官网上还可以静态注册的广播如下:

ACTION_LOCKED_BOOT_COMPLETED、ACTION_BOOT_COMPLETED
豁免的原因这些广播仅在首次启动时发送一次,而且许多应用需要接收此广播以调度作业、闹钟等。
ACTION_USER_INITIALIZE、"android.intent.action.USER_ADDED"、"android.intent.action.USER_REMOVED"
这些广播受特许权限保护,因此大多数普通应用都无法接收它们。
"android.intent.action.TIME_SET"、ACTION_TIMEZONE_CHANGED、ACTION_NEXT_ALARM_CLOCK_CHANGED
当时间、时区或闹钟发生更改时,时钟应用可能需要接收这些广播以更新闹钟。
ACTION_LOCALE_CHANGED
仅在语言区域发生更改时发送,这种情况并不常见。当语言区域发生更改时,应用可能需要更新其数据。
ACTION_USB_ACCESSORY_ATTACHED、ACTION_USB_ACCESSORY_DETACHED、ACTION_USB_DEVICE_ATTACHED、ACTION_USB_DEVICE_DETACHED
如果某个应用需要了解这些与 USB 有关的事件,除了为广播进行注册,目前还没有很好的替代方法。
ACTION_CONNECTION_STATE_CHANGED、ACTION_CONNECTION_STATE_CHANGED、ACTION_ACL_CONNECTED、ACTION_ACL_DISCONNECTED
如果应用接收到针对这些蓝牙事件的广播,则用户体验不太可能受到影响。
ACTION_CARRIER_CONFIG_CHANGED、TelephonyIntents.ACTION_*_SUBSCRIPTION_CHANGED、"TelephonyIntents.SECRET_CODE_ACTION"、ACTION_PHONE_STATE_CHANGED、ACTION_PHONE_ACCOUNT_REGISTERED、ACTION_PHONE_ACCOUNT_UNREGISTERED
OEM 电话应用可能需要接收这些广播。
LOGIN_ACCOUNTS_CHANGED_ACTION
有些应用需要了解登录帐号的更改,以便为新帐号和已更改的帐号设置调度的操作。
ACTION_ACCOUNT_REMOVED
具有帐号可见性的应用会在帐号被移除后收到此广播。如果应用只需要对此帐号更改执行操作,则强烈建议应用使用此广播,而不是使用已弃用的 LOGIN_ACCOUNTS_CHANGED_ACTION。
ACTION_PACKAGE_DATA_CLEARED
仅在用户明确清除“设置”中的数据时发送,因此广播接收器不太可能对用户体验造成显著影响。
ACTION_PACKAGE_FULLY_REMOVED
某些应用可能需要在其他软件包被移除时更新其存储的数据;对于这些应用来说,除了为此广播进行注册,没有很好的替代方法。

注意:其他与软件包相关的广播(例如 ACTION_PACKAGE_REPLACED)未能免受新限制的约束。这些广播很常见,豁免的话可能会影响性能。

ACTION_NEW_OUTGOING_CALL
应用需要接收此广播,以在用户拨打电话时采取相应操作。

ACTION_DEVICE_OWNER_CHANGED
此直播的发送频率不高;某些应用需要接收它来了解设备的安全状态已发生更改。

ACTION_EVENT_REMINDER
由日历提供程序发送,以向日历应用发布事件提醒。由于日历提供程序并不知道日历应用是什么,因此此广播必须是隐式的。

ACTION_MEDIA_MOUNTED、ACTION_MEDIA_CHECKING、ACTION_MEDIA_UNMOUNTED、ACTION_MEDIA_EJECT、ACTION_MEDIA_UNMOUNTABLE、ACTION_MEDIA_REMOVED、ACTION_MEDIA_BAD_REMOVAL
这些广播会在用户与设备的物理互动(安装或移除存储卷)或启动初始化(可用卷装载时)过程中发送,并且通常受用户控制。

SMS_RECEIVED_ACTION、WAP_PUSH_RECEIVED_ACTION
短信接收者应用需要依赖这些广播。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容