基于发布订阅模式,用于系统或者app之间交流的组件
2.广播的注册方式有哪些?
静态注册,在AndroidManifest.xml 文件中声明
1
2
3
4
5
6<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>动态注册,在代码调用 registerReceiver(BroadcastReceiver,IntentFliter)
1
2
3
4IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
intentFilter.addAction(Intent.ACTION_INPUT_METHOD_CHANGED);
context.registerReceiver(receiver,intentFilter);
3.广播的分类(发送广播方式) & 特性 & 使用场景?
无序广播 sendBroadcast(Intent)
context.sendBroadcast(Intent)方法发送的广播,不可被拦截,当然发送的数据,接收者是不能进行修改的。
有序广播 sendOrderedBroadcast(Intent,String)
方法一次将广播发送到一个接收器。当每个接收器轮流执行时,它可以将结果传播到下一个接收器,或者可以完全中止广播,从而不会将其传递给其他接收器。可以使用匹配的intent-filter的android:priority属性控制接收者的运行顺序;具有相同优先级的接收器将以任意顺序运行。可被拦截,而且接收者是可以修改其中要发送的数据,修改和添加都是可以的,这就意味着优先接收者对数据修改之后,下一个接收者接受的数据是上一个接收者已经修改了的
本地广播 LocalBroadcastManager.sendBroadcast(Intent)
仅在APP内部传递的广播,无需处理跨进程通信。
4.说说系统广播和本地广播的原理 & 区别 & 使用场景。
本地广播基于Handler实现,使用场景是仅在APP应用内通信
系统广播基于Binder机制向AMS发送广播,AMS查找符合条件(IntentFliter/Permission等)的BroadcastReceiver,将广播发送到相应的BroadcastReceiver的消息队列。
参考资料:常见系统广播
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
电池电量低 Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播 Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时 Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置–SD卡和设备内存–卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安装APK Intent.ACTION_PACKAGE_ADDED
成功删除APK Intent.ACTION_PACKAGE_REMOVED
重启设备 Intent.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON
关闭系统时 Intent.ACTION_SHUTDOWN
重启设备 Intent.ACTION_REBOOT
……