## 作用

用于应用程序之间的通信,能够跨进程。

使用场景

  1. 手机的电量改变发送的广播事件为特定广播接收者接收并处理相应过程
  2. 手机网络情况改变
  3. 手机通信情况改变等

使用

针对系统广播事件

  1. 注册BroadcastReciver

    • 动态注册

      registerReceiver(BroadcastReciver receiver, IntentFilter filter);
      //使用完动态注册 必须手动解除注册状态 一般在onDestory
      //
    • 静态注册(mainifest.xml文件)

      <receiver android:name="receiver">
      <intent-filter>
      <action android:name="android.intent.action.BATTERY_CHANGED"/>
      </intent-filter>
      </receiver>

      • 对于静态注册的广播接收器不受任何组件的生命周期影响,当应用程序关闭时,对应广播一来,程序会被唤醒处理广播。该广播接收器是常驻内存的,比较耗电。
      • 动态注册的广播接收器则与之相反,生命周期可以由程序员掌控。
      • BroadcastReciver是运行在UI线程中的也就是说在其onRecive中不能处理长时间的工作,或则造成UI的卡顿等错误状况。
  2. 重写onRecive()方法处理相应的广播事件

    final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    // action = android.intent.action.BATTERY_CHANGED
    if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
    int current = intent.getExtras().getInt("level");
    int total = intent.getExtras().getInt("scale");
    int value = current * 100 / total;
    text.setText("当前电量是" + value + "%" + "");
    }
    }
    };

自定义广播内容

在需要广播的地方sendBroadcast(intent); 创建Intent对象并且设置Action (Action可以为系统的或自定义的)和 data。

Intent intent = new Intent();
intent.setAction("mybroadcast");
intent.putExtra("message", "hello world!");
sendBroadcast(intent);

样例

针对电量改变广播事件处理Demo

 final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// action = android.intent.action.BATTERY_CHANGED
if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int current = intent.getExtras().getInt("level");
int total = intent.getExtras().getInt("scale");
int value = current * 100 / total;
text.setText("当前电量是" + value + "%" + "");
}
}
};

// 创建Intent过滤器
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, filter);


// 注册
registerReceiver(receiver, filter);
unregisterReciver(reciver)
//
常见系统广播事件

监听网络变化 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
当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android系统都会广播此Action消息 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等 参考 Configuration.java) 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
设备日期发生改变时会发出此广播 Intent.ACTION_DATE_CHANGED
设备内存不足时发出的广播 Intent.ACTION_DEVICE_STORAGE_LOW
设备内存从不足到充足时发出的广播 Intent.ACTION_DEVICE_STORAGE_OK;

广播分类

广播 使用 特点
有序广播(Ordered Broadcast) sendOrderedBroadcast(intent); 按照广播接收器的先后顺序先后接收消息,先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播 setResult getResult abort设置,截取,中端广播消息
无序广播 sendBroadcast(intent); 广播接收器没有先后顺序,没有那个广播接收器可以截断更改或者中断广播消息。
本地广播 LocalBroadcastManager l= LocalBroadcastManager.getInstance(this);l.sendBroadcast(intent); 本地广播限制只能本应用程序发送和接收广播消息。
+ 有序广播无序广播还是系统的广播都是全局性的广播,即发出的广播可以被其他任何应用程序接收到.
+ 本地广播只能被动态注册,不能静态注册。动态注册或方法时需要用到LocalBroadcastManager。