Android 基础回顾:Broadcast 基础

本文深入解析Android中的广播机制,涵盖广播的分类、实现方式及其在不同Android版本中的限制。从静态与动态注册的区别,到本地与全局广播的作用范围,再到有序与无序广播的处理流程,全面解读广播在Android开发中的运用。

1、关于广播

广播是 Android 提供的一种全局通信机制。

1.1 分类

  1. 按照注册方式:静态注册和动态注册两种;
  2. 按照作用范围:本地广播和普通广播两种,普通广播是全局的,所有应用程序都可以接收到,容易会引起安全问题。本地广播只能够在应用内传递,广播接收器也只能接收应用内发出的广播;
  3. 按照是否有序:有序广播和无序广播两种,无序广播各接收器接收的顺序无法确定,并且在广播发出之后接收器只能接收,不能拦截和进行其他处理,两者的区别主要体现在发送时调用的方法上。

1.2 实现

1.2.1 静态广播

注册,这里的 StaticBroadcastReceiver 是自定义类:

<receiver android:name=".StaticBroadcastReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

我们可以将要实现的逻辑放在这个类的方法中进行执行:

public class StaticBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// Do something
	}
}

需要注意 Andrdoid 8.0 之后系统对广播进行了一些限制(官方文档),具体地:

  1. 在 Android 8.0 的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest 文件对有些广播进行静态注册(注意“有些”,因为不是所有的广播都不能注册)。
  2. 当程序运行在后台的时候,静态广播中不能启动服务。比如之前实现闹钟的时候是监听时间变化来实现的,在 8.0 之后就会抛出异常。

解决方式是使用动态注册方式(一般情况下使用动态注册就好了)。

1.2.2 动态广播

与静态广播相似,但是不需要在 Manifest 中进行注册。

    // 监听广播:一般在 Activity 的 onCreate() 方法中注册
    netWorkChangReceiver = new StaticBroadcastReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    registerReceiver(netWorkChangReceiver, filter);

    // 取消监听:然后在 Activity 的 onDestroy() 中取消注册
    unregisterReceiver(netWorkChangReceiver);

注意当页面被销毁的时候需要取消注册广播!

1.2.3 本地广播

本地广播的核心类是 LocalBroadcastManager,使用它的静态方法 getInstance() 获取一个单例之后就可以使用该单例的 registerReceiver()unregisterReceiver()sendBroadcast() 等方法来进行操作了。

    // 获取单例
    localBroadcastManager = LocalBroadcastManager.getInstance(this);

    // 注册广播
    IntentFilter filter = new IntentFilter();
    filter.addAction("me.shouheng.MyBroadcastReceiver");
    localReceiver = new LocalReceiver();
    localBroadcastManager.registerReceiver(localReceiver, filter);

    // 发送广播
    Intent intent = new Intent("me.shouheng.MyBroadcastReceiver");
    localBroadcastManager.sendBroadcast(intent);

    // 取消注册
    localBroadcastManager.unregisterReceiver(localReceiver);
1.2.4 有序广播

在 xml 中进行注册的时候通过 android:priority 指定一个范围在 -1000~1000 之间的整数来指定广播的接收顺序。优先级高的会先接收到,优先级相等的话则顺序不确定。并且前面的广播可以在方法中向 Intent 写入数据,后面的广播可以接收到写入的值。

    <receiver android:name=".MyReceiver_1">
        <intent-filter android:priority="200">
            <action android:name="com.song.123"/>
        </intent-filter>
    </receiver>
    <receiver android:name=".MyReceiver_2">
        <intent-filter android:priority="1000">
            <action android:name="com.song.123"/>
        </intent-filter>
    </receiver>

Android 基础梳理系列文章,关注作者及时获取更多学习资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值