Android BroadcastReceiver详解

通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。

类别

普通广播(Normal Broadcast)
有序广播(Ordered Broadcast)
粘性广播(Sticky Broadcast)
系统广播(System Broadcast)
本地广播(Local Broadcast)

普通广播(Normal Broadcast)
又称无序广播,这种广播完全是异步的,所有与广播Intent匹配的BroadcastReceiver,都可以收到这条广播,并且不分先后顺序,视为同时收到,通过Context.sendBroadcast()方法发送。这种广播的效率比较高,但缺点是接收器不能将处理结果传递给下一个接收器,并且无法在中途终止广播。

        Intent intent = new Intent();
        //对应BroadcastReceiver中intentFilter的action
        intent.setAction("test");
        //发送广播
        sendBroadcast(intent);

有序广播(Ordered Broadcast)
这是一种同步执行的广播,通过Context.sendOrderedBroadcast()方法发送,这种广播发出后,通过receiver的intent-filter中的android:priority属性来设置优先级,优先级从-1000~1000,数越大,优先级越高,使用setResult()方法把结果传递给下一个接收者,通过getResult()方法获取上一个接收者传递过来的结果,并可以通过abortBroadcast()方法丢弃该广播,使该广播不再传递给下一个接收者。

粘性广播(Sticky Broadcast)
粘性广播通过Context.sendStickBroadcast()方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得BROADCAST_STICKY权限。(在 android 5.0/api 21后不再推荐使用)

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

系统广播(System Broadcast)
Android系统中内置了多个系统广播,只要涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。

本地广播(Local Broadcast)
以上广播都属于全局广播,发出去的广播,只要有匹配的接收者,就可以收到广播。这样一来会造成一些问题,一是消耗性能,二是容易引起安全性的问题,为了能够简单的解决这方面的问题,Android引入了一套广播本地广播机制,使用该机制发出的广播只能够在本应用内部进行传递,并且广播接收器也只能接收来自本应用发出的广播。
使用方法
1.注册本地广播接收器

IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("test");
        if (mReceiver == null) {
            mReceiver = new MyReceiver();
            LocalBroadcastManager.getInstance(mContext).registerReceiver(mReceiver,intentFilter);
        }

2.发送本地广播

        Intent intent = new Intent();
        intent.setAction("test");
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);

3.注销本地广播接收器

        @Override
        public void onDestroy() {
            if (mReceiver != null) {
                LocalBroadcastManager.getInstance(mContext).unregisterReceiver(mReceiver);
            }
            super.onDestroy();
        }

广播的注册

静态注册(常驻)
静态注册就是在AndroidManifest中注册BroadcastReceiver,并指定它所接收的广播种类,如下面配置的MyReceiver用来接收开机广播

<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

动态注册(非常驻)

    @Override
    protected void onResume() {
        super.onResume();
        mReceiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("test");
        registerReceiver(mReceiver, intentFilter);  // 注册广播接收器
    }

    @Override
    protected void onPause() {
        unregisterReceiver(mReceiver);  // 注销广播接收器
        super.onPause();
    }

本文用到的BroadcastReceiver

    public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

        }
    }

特别声明
Android 8.0(API级别26)取消大部分静态注册广播,建议使用动态广播
https://developer.android.google.cn/about/versions/oreo/android-8.0

发布了134 篇原创文章 · 获赞 197 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/u011733020/article/details/100124131