Broadcast

作者: _Rice_ | 来源:发表于2019-02-27 09:56 被阅读0次

特点:是一个典型的发布-订阅模式,发送方不关心接收方是否接到数据,也不关系接收方如何处理数据

注意:

  • 安卓7以上系统,在清单中声明接收器通常不起作用
  • 当BroadcastReceiver在onReceive()运行时会被视为前台进程。结束onReceive()时BroadcastReceiver将不再是活跃状态,会被设为低优先级进程非常容易被杀掉。通常不要对广播接收器进行耗时操作,如果非要进行耗时操作,那么可以开启子线程。

分类:普通广播、有序广播、本地广播、sticky广播

普通广播

优点:

  • 消息传递效率高

缺点:

  • 执行顺序不确定
  • 接受者无法将处理的结果传递给下一个接受者
  • 无法中断传播,直到没有与之匹配的广播接收器为止

广播接受者定义:

public class HelloBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = HelloBroadcastReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG,"hello");
    }
}

当接受到广播时,会调用onReceive()方法。

广播接受者声明方式:

1、清单声明

<receiver
    android:name=".components.broadcast.HelloBroadcastReceiver"
    android:exported="false">
    <!--intent过滤器指定接收者订阅的广播操作。-->
    <intent-filter>
        <action android:name="hello"/>

    </intent-filter>
</receiver>

exported为false表示接收方不接受来自应用外的广播

2、上下文注册

registerReceiver(new HelloBroadcastReceiver(),new IntentFilter("hello"));

取消注册

unregisterReceiver(android.content.BroadcastReceiver)

发送广播:

sendBroadcast(new Intent("hello"));

有序广播

优点:

  • 所有广播接收器按优先级顺序执行,通过intent-filer的android:priority属性
  • 当前广播接收器可使用setResult()函数将结果传递给下一个广播接收器,通过getResult()函数获取上一个广播接收器返回的结果
  • 可以调用abortBroadcast()函数丢弃该广播,使其不再传送给其他广播接收器

显然有序广播优化了普通广播的缺点

设置广播优先级

mHelloBroadcastReceiver = new HelloBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter("hello");
intentFilter.setPriority(50);
registerReceiver(mHelloBroadcastReceiver,intentFilter);

发送广播

sendOrderedBroadcast(new Intent("hello"),null);

讲解:

@Override
public void sendOrderedBroadcast(Intent intent,
            String receiverPermission) {
    mBase.sendOrderedBroadcast(intent, receiverPermission);
    }

receiverPermission这个参数是接受权限,接受应用必须请求对应权限

本地广播

上述的广播都是全局的,如果不需要向应用程序外部的组件发起广播,可以使用本地广播,提高效率。

LocalBroadcastManager可以实现限于应用内的广播

//注册广播
LocalBroadcastManager.getInstance(this).registerReceiver(@NonNull BroadcastReceiver receiver,
            @NonNull IntentFilter filter)

//注销广播
LocalBroadcastManager.getInstance(this).unregisterReceiver(@NonNull BroadcastReceiver receiver)

//发送异步广播
LocalBroadcastManager.getInstance(this).sendBroadcast(@NonNull Intent intent)

//发送本地广播
LocalBroadcastManager.getInstance(this).sendBroadcastSync(@NonNull Intent intent)

sticky广播

通过Context.sendStickyBroadcast(Intent intent)发送。发送粘性广播还需要BROADCAST_STICKY权限:

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

特点:

  • 此广播会滞留,即使已经有广播接收器处理了该广播,此广播认可继续被接受。直到调用removeStickyBroadcast()函数

参考:https://developer.android.com/guide/components/broadcasts

相关文章

网友评论

      本文标题:Broadcast

      本文链接:https://www.haomeiwen.com/subject/gxlxuqtx.html