Android笔记-四大组件之Broadcast Receiver

简介

Broadcast Receiver,即广播接收器,顾名思义,通过广播的方式进行消息传递。

分类

  • 标准广播
    这是一种完全异步执行的广播,这种广播发出后,所有接收器之间几乎同时收到消息,它们之间没有任何顺序可言,因此这种广播效率比较高,无法被拦截。

  • 有序广播
    这是一种同步执行的广播,这种广播发出后,各接收器是按照注册的优先级的顺序来进行接收的,优先级高的先接收,优先级低的后接收,并且可以被中断,一旦被中断则后续接收器则无法接收到此消息了。

使用方式

广播使用方式基本相同,在BroadcastReceiver类中的onReceive()方法中处理接收器逻辑,但是不能进行耗时操作,因为在这里不允许开启线程的;另外广播是有优先级的,优先级高的先收到广播。

  • 标准广播
    • 系统广播

      • 静态注册

      第一步,编写广播接收器处理代码,该类继承自BroadcastReceiver类

      public class BootCompleteReceiver extends BroadcastReceiver {
      
          @Override
          public void onReceive(Context context, Intent intent) {
              Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
          }
      }
      

      第二步,在manifest文件中声明

      
          
              
          
      
      

      第三步,添加权限

      
      

      静态注册的方式是通过xml在manifest文件中进行注册,其特点是:在程序未启动的情况也能接收到广播消息,并且无法取消注册。

      • 动态注册

      第一步,编写广播接收器处理代码,该类继承自BroadcastReceiver类

      public class NetworkChangeReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
      
              //get the state of network
              ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
              NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
      
              String state;
              if (networkInfo != null && networkInfo.isAvailable()) {
                  state = "available";
              } else {
                  state = "unavailable";
              }
      
              Toast.makeText(context, "Network is " + state, Toast.LENGTH_LONG).show();
          }
      }
      

      第二步,在Activity 中注册及取消

      public class BroadcastDynamicSystemActivity extends AppCompatActivity {
      
          private IntentFilter intentFilter;
          private NetworkChangeReceiver networkChangeReceiver;
      
          public static void startAction(Context context) {
              context.startActivity(new Intent(context, BroadcastDynamicSystemActivity.class));
          }
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_broadcast_dynamic_system);
      
              //register network change broadcast receiver
              this.intentFilter = new IntentFilter();
              this.intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
              this.networkChangeReceiver = new NetworkChangeReceiver();
      
              registerReceiver(this.networkChangeReceiver, this.intentFilter);
          }
      
          @Override
          protected void onDestroy() {
              super.onDestroy();
      
              //unregister network change broadcast receiver
              unregisterReceiver(this.networkChangeReceiver);
          }
      }
      

      第三步,在manifest文件中添加网络访问权限

      
      

      动态注册的流程是:先编写广播接收器的处理方法(继承自BroadcastReceiver类),然后在应用的地方进行注册和取消注册。这种方式的特点是:
      1. 只有动态注册代码执行了才会接收广播,没执行是不会收到广播的;
      2. 需要实时取消注册,以防内存泄漏。

    • 自定义广播

      • 标准广播

      第一步,编写广播接收器处理代码,该类继承自BroadcastReceiver类

      public class MyStandardBroadcastReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              Toast.makeText(context, "My Standard Broadcast Receiver", Toast.LENGTH_LONG).show();
          }
      }
      

      第二步,在manifest中注册(此为静态注册方式注册,亦可动态方式注册)

      
          
              
          
      
      

      第三步,发送自定义广播

      sendBroadcast(new Intent("com.example.broadcast.MY_BROADCAST"));
      

      这里需要注意的是广播的action name必须一致。

      • 有序广播

      第一步,编写广播接收器处理代码,该类继承自BroadcastReceiver类

      public class MyOrderedBroadcastReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              Toast.makeText(context, "My Ordered Broadcast Receiver", Toast.LENGTH_LONG).show();
              
              //中断传播
              abortBroadcast();
          }
      }
      

      第二步,在manifest中注册(此为静态方式注册,亦可动态注册)

      
          
              
          
      
      

      第三步,发送自定义广播

      sendOrderedBroadcast(new Intent("com.example.broadcast.MY_BROADCAST"), null);
      

      有序广播和标准广播使用方式上唯一区别在于发送方法不同以及有序广播可以通过abortBroadcast()方法来中断广播的传递。

  • 本地广播

    标准广播都是全局的,即不仅本应用会接收而且其他应用也可以接收,因此如果一直发送标准广播不仅会对系统造成污染,而且也会带来安全隐患,为了解决这些问题,Android系统引入了本地广播机制。

    • 使用方法
      第一步,编写广播接收器处理代码,该类继承自BroadcastReceiver类

      public class LocalBroadcastReceiver extends BroadcastReceiver {
      
          @Override
          public void onReceive(Context context, Intent intent) {
              Toast.makeText(context, "Local Broadcast Receiver", Toast.LENGTH_LONG).show();
          }
      }
      

      第二步,发送广播

      private IntentFilter intentFilter;
      private LocalBroadcastReceiver localBroadcastReceiver;
      private LocalBroadcastManager localBroadcastManager;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          ……
          
          this.intentFilter = new IntentFilter();
          this.intentFilter.addAction("com.example.broadcast.MY_LOCAL_BROADCAST");
          this.localBroadcastManager = LocalBroadcastManager.getInstance(this);
          this.localBroadcastReceiver = new LocalBroadcastReceiver();
          this.localBroadcastManager.registerReceiver(this.localBroadcastReceiver, this.intentFilter);
      }
      
      @Override
      protected void onDestroy() {
          super.onDestroy();
          this.localBroadcastManager.unregisterReceiver(this.localBroadcastReceiver);
      }
      
      //发送本地广播
      this.localBroadcastManager.sendBroadcast(new Intent("com.example.broadcast.MY_LOCAL_BROADCAST"));
      
    • 特点

      • 消息只在本应用内进行传递;
      • 无法通过静态注册的方式进行注册;
      • 比系统全局广播更高效。

总结

  • 当需要在程序未启动就接收广播消息时,使用静态注册方式注册广播;
  • 当需要灵活控制接收或者不接受广播消息时,使用动态注册方式注册广播;
  • 当广播消息仅在本应用内部进行传递,使用本地广播更高效更安全;
  • 当需要对广播消息对传递进行顺序控制时,使用有序广播广播。

你可能感兴趣的:(Android笔记-四大组件之Broadcast Receiver)