Android部分-2:BroadcastReceiver答案

1.广播是什么?

基于发布订阅模式,用于系统或者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
    4
    IntentFilter 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

……

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×