BroadcastReceiver:广播的使用

QuibblerQuibbler 2020-05-04 约 6 分钟 1905 次阅读

BroadcastReceiver:广播的使用

广播是Android四大组件之一。用广播可以实现简单进程间通信;一定程度上还能解耦;关于BroadcastReceiver的原理参考BroadcastReceiver工作流程。

广播除了用来通知,桌面小部件AppWidgetProvider也是继承自BroadcastReceiver实现更新桌面挂件的,参考AppWidgetProvider:桌面小挂件。

1、BroadcastReceiver

1.1、简介

BroadcastReceiverAndroid四大组件之一,常用于不同组件和多线程之间的通信。适当的通过广播通信,传递简单的数据可以极大的降低模块耦合!

1.2、广播的类型

Android中的广播机制可以分为标准广播和有序广播两种类型。

①标准广播:是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎同时接收到这条广播消息,它们之间没有任何项目顺序可言。这种广播的效率比较高,但也意味着它是无法被截断的。

②有序广播:是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。此时的广播接收器是有先后顺序,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

2、注册广播

作为Android四大组件之一,四大组件都必须在AndroidManifest中注册,但是广播比较特殊。广播有两种注册方式:静态注册和动态注册。现在广播都是通过动态注册才能生效,所以现在AndroidManifest.xml中不需要注册BroadcastReceiver也可以使用。

2.1、静态注册(废弃)

在AndroidManifest中注册receiver节点即可

<receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        
        <intent-filter>
            <action android:name="***" />
        </intent-filter>
        
    </receiver>

2.2、动态注册

在代码中动态注册广播,

mBroadcastReceiver = new MyReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("***");
    registerReceiver(mBroadcastReceiver, intentFilter);

记得注册的广播接收器一定要反注册,否则会造成内存泄漏

unregisterReceiver(mBroadcastReceiver);

3、发送广播

广播的发送很简单,广播发送基本原理参考BroadcastReceiver工作流程。

3.1、发送有序广播

使用sendOrderedBroadcast(Intent intent,String receiverPermission)方法发送有序广播:

Intent intent = new Intent(action);
    sendOrderedBroadcast(intent, null);

3.2、发送标准广播

sendBroadcast(Intent)方法比较常用的发送广播

Intent intent = new Intent(action);
    sendBroadcast(intent);

4、本地广播

前面发送的广播都是全局的,其它应用可以接收到。可能会造成安全泄漏,Android提供了一种本地广播,通过LocalBroadcastManager,只在本应用内传递,不会被三方APP接收到的广播。本地广播LocalBroadcastManager内部通过Handler实现,详见LocalBroadcastManager源码解析。

4.1、注册本地广播接收器

接受本地广播需要借助LocalBroadcastManager注册本地广播接收器:

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
    localBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter);

同样的也需要反注册本地广播接收器:

localBroadcastManager.unregisterReceiver(BroadcastReceiver);

4.2、发送本地广播

发送本地广播也需要通过LocalBroadcastManager:

localBroadcastManager.sendBroadcast(intent);

参考资料:

        Broadcasts overview

        Implicit Broadcast Exceptions

        Android广播机制的两种类型

Android广播--官方文档

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w