Android广播机制-Broadcast Receiver

广播机制 为了进行系统级别的消息通知,Android引入了一套广播消息机制,就像是我们上小学的时候,每个教室都会有个喇叭,到时间就会播放眼保健操一样。

广播机制

为了进行系统级别的消息通知,Android引入了一套广播消息机制,就像是我们上小学的时候,每个教室都会有个喇叭,到时间就会播放眼保健操一样。

广播有两种

  1. 标准广播
  2. 有序广播

标准广播是一种异步执行的广播,广播发出之后,所有的广播接收器都可以几乎在同一时间接收到这条广播,没有先后接收的顺序,标准广播也不可以被截断。

有序广播是一种同步执行的广播,广播接收器接收广播是有先后顺序的,优先级高的接收器可以先接受广播并且进行截断,之后的广播接收器就无法接受到此条广播,同一时间只有一个广播接收器能够接收这条广播。

接收广播

Android内置了许多系统级别的广播,例如手机开机会发送一条广播,电量变化会发送一条广播,wifi连接也会发送一条广播,同时我们也可以自定义广播,如果我们想要接收到这些广播就需要使用广播接收器

广播接收器可以对自己感兴趣的广播进行注册,注册之后就可以接收该广播,并且在接收器内部的onReceive()方法进行逻辑处理。注册的方式有两种:

  1. 动态注册:在代码中通过registerReceiver()
  2. 静态注册:在Manifest文件中进行注册

动态注册:

  • 新建一个类继承BroadcastReceiver
  • 重写父类的onReceive()方法实现相应逻辑处理
  • 创建一个IntentFliter并添加action,action就是我们需要监听的广播
  • 通过registerReceiver()方法进行注册

静态注册:

  • 新建一个类继承BroadcastReceiver
  • 重写父类的onReceive()方法实现相应逻辑处理
  • 在AndroidManifest.xml通过标签在中进行注册

动态注册接收系统广播–wifi开关

package com.xiezhen.justwrite;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends Activity {private TestBroadCastReceiver tb;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wifiListener();}private void wifiListener() {IntentFilter intentFilter = new IntentFilter();//添加的action就是我们要监听的广播,wifi开关的时候,系统都会发送这条广播。intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);tb = new TestBroadCastReceiver();//通过registerReceiver方法,将我们创建的Receiver以及 InterFilter传入,完成注册。registerReceiver(tb, intentFilter);}class TestBroadCastReceiver extends BroadcastReceiver {//重写onReceive方法来进行一些接收到广播后的逻辑处理,对用户进行提醒。@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);//判断当前wifi连接状态NetworkInfo.State state = networkInfo.getState();if (state == NetworkInfo.State.DISCONNECTED) {Log.d("xiezhen", "DISCONNECTED");} else if (state == NetworkInfo.State.CONNECTING) {Log.d("xiezhen", "CONNECTING");} else if (state == NetworkInfo.State.CONNECTED) {