Android广播与接收——BroadcastReceiver

Android提供了广播发送和接收机制。广播有标准广播有序广播两种类型。标准广播好似村里面的大喇叭广播消息;有序广播好像是古代驿站传递消息。
Android systemApplication可以发出广播。其中Android system广播标识时字符串常量,这些字符串常量是Intent类(如下给出其继承关系)的属性,具体请参考Android API文档。对于Application来说可以通过,

  1. sendBroadcast(Intent intent)
  2. sendOrderedBroadcast(Intent intent, String string)

来广播消息。当发送有序广播时,接受广播的BroadcastReceiver的onReceive方法中可以执行abortBroadcast(),截断该广播继续传播。

public class Intent
extends Object implements Parcelable, Cloneable

java.lang.Object
   ↳	android.content.Intent

监听Android systemApplication广播的动态注册方式的一般步骤为:

  1. 定义一个继承BroadcastReceiver的XXXReceiver类
  2. 于XXXReceiver类中重写其父类的onReceive(Context context, Intent intent)方法
  3. 于需要的地方new出XXXReceiver类的一个object
  4. 于合适的地方调用context的registerReceiver(BroadcastReceiver broadcastReceiver, IntentFilter intentFilter)方法
  5. 于合适的地方调用context的unregisterReceiver(BroadcastReceiver broadcastReceiver)方法

完成上述五个步骤后,当Android systemApplication发出广播时,onReceive函数就会得到回调。

例如,打开名为NetChangeReceiver.java的文件,如下所示。文件中定义了一个监听网络变化的广播接收器。并且自定义了registerReceiverBy(Context context)和unregisterReceiverBy(Context context)函数,用来注册广播接收器。之所以将registerReceiverunregisterReceiver进行封装,提高代码的可管理性,代码可读性,代码整洁度,降低调试难度,代码耦合度。

package com.ocean.android.systembroadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class NetChangeReceiver extends BroadcastReceiver {

    private static final String TAG = "NetChangeReceiver";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        Log.i(TAG, "onReceive: in");
        //add your code here
    }
    public void registerReceiverBy(Context context){
        Log.i(TAG, "registerReceiver: in");
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        context.registerReceiver(this, intentFilter);
    }
    public void unregisterReceiverBy(Context context){
        Log.i(TAG, "unregisterReceiver: in");
        context.unregisterReceiver(this);
    }
}

监听Android systemApplication广播的静态注册方式的一般步骤为:(当程序在未启动的情况下也要接收到广播时,需要考虑静态注册方式)

  1. 定义一个继承BroadcastReceiver的XXXReceiver类
  2. 于XXXReceiver类中重写其父类的onReceive(Context context, Intent intent)方法
  3. 于AndroidMainfest.xml文件中添加下面代码,其中intent-filter中的android:name=“广播常量码”。
<receiver
   android:name="com.ocean.android.systembroadcastreceiver.NetChangeReceiver "
   ...
   >
   <intent-filter>
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
   </intent-filter>
</receiver>

Application可以通过调用Context的sendBroadCast()或sendOrderedBroadCast()发出广播。

注意事项

  1. 需要说明的是不要在onReceive函数中执行耗时操作
  2. Android O(Android 8)对BroadcastReceiver进行了改进,启动BroadcastReceiver的Intent必须是显示的Intent:要么直接设置XXXReceiver的类名;要么通过Action和package来设置Intent。并且开机启动的BroadcastReceiver不允许在后台启动Service。

本地广播
所谓本地广播是指本应用程序所发出的广播只能够在本应用程序内部进行传递。它使用了LocalBroadcastManager进行管理,提供了发送广播、注册以及取消注册的方法。获取它的实例可以使用LocalBroadcastManager.getInstance(this)方法。

  • 发送本地广播LocalBroadcastManager.sendBroadcast()
  • 注册本地广播监听器LocalBroadcastManager.registerReceiver()
  • 取消注册本地广播监听器LocalBroadcastManager.unregisterReceiver()

猜你喜欢

转载自blog.csdn.net/codeIsGood/article/details/104009989