第一行代码 读笔⑤ (Broadcast)

本文深入解析了Android平台上的广播机制,包括广播的基本概念、广播的分类(标准广播与有序广播)、广播的实现方式(动态注册与静态注册),以及如何发送不同类型的广播。此外,还介绍了如何使用本地广播来提高应用内部通信的安全性和效率。

全局大喇叭,详解广播机制

广播(Broadcast):一种广泛运用的在应用程序之间传输信息的机制。
传输信息:

  • 实现了不同的程序之间的数据传输与共享。当于发送广播的action相同的接受者都能接受该广播。
  • 起到了一个通知的作用。如接受Service的通知。
    广播分类:

- 标准广播(Normal broadcasts): 完全异步执行的广播。所有广播接收器(Broadcast Receiver)同时收到该广播。效率较高,当无法截断。
- 有序广播(Orderedbroadcasts): 同步执行的广播,各Broadcast Received按序(优先级)接受信息。可截断的广播。

实现广播接受:

  • 动态注册:在代码中进行广播的注册。
    • 优点:自由的控制注册于注销,较灵活。
    • 缺点:由于在代码中注册,因此必须在相应Activity启动才可以接受广播。

1.对于BroadcastReceiver类的继承,对onReceive()方法的重写,其中代码,会在接受到广播时被执行。

PS:广播接受器中不允许开启线程,因此不应再onReceiver()方法中进行耗时操作或者添加过多逻辑,避免因长时间未结束,程序报错。

class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast",
                    Toast.LENGTH_SHORT).show();
        }
    }

2.过滤器(intentFilter)的设置。intentFilter相当于广播中的频率,使用filter.addAction添加行为类型,用来确定接受哪一些广播。

intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");

3.将广播进行注册,调用regiseterReceiver()将Receiver与IntentFilter的实例传入。

registerReceiver(localReceiver, intentFilter);

PS:在结束使用后,动态广播需要取消注册。在onDestroty()中调用unregisterReceiver()方法。

unregisterReceiver(localReceiver);

静态注册: 可以在程序未启动的情况下,保持广播接受状态。
需要在AndroidManifest .xml中注册,不需程序启动即可接收,可用作自动启动程序。
1.对于Broadcast Receiver的编写,与动态没有区别,对于onReceive()方法的重写。
2.在AndroidManifest .xml中注册。

  • 标签,静态广播在其中注册。
  • android:name 指定具体的广播器。
  • 指定接收的广播
        </receiver>
        <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

如果是对于系统的一些广播监听,如开机广播,需要声明权限。

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

发送标准广播
通过intent指定发送广播的值,调用Context的sendBroadcast()方法发出广播。
(个人感觉类似于隐式intent的使用,广播发送方都是通过隐式意图,发送给其他程序)

Intent intent = new Intent();
intent.setAction("...");
Context.sendBroadcast(intent);

发送有序广播:
相比于标准广播,有了一个优先度的不同。发送广播只是调用方法的不同,调sendOrderedBroadcast()方法,方法中第二个参数为与权限相关的字符串。

Intent intent = new Intent();
intent.setAction("...");
Context.sendOrderedBroadcast(intent,null);

广播接受的顺序:
在注册时对其进行设置,android:priority=“…”

<application>         
    <receiver android:name=".Receiver"> 
        <intent-filter android:priority="1000">
            <action android:name=".............."/>
        </intent-filter>
    </receiver>
</application>      

广播的拦截:
在onReceive()中,调用abortBroadcast()方法完成拦截。

本地广播的使用
为了保证安全性问题,防止包含关键性数据的广播被其他程序拦截,或者其他程序不断向本接收器发送垃圾广播,从而有了本地广播机制
本地广播:使用该机制的发出的广播,只能在本程序内传递,接收器也可能接受本应用的广播。
使用:在于利用

1..创建LocalBroadcastManager:

final LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);

2.通过LocalBroadcastManager发送广播

Intent intent=new Intent();
        intent.setAction(".......................");
        localBroadcastManager.sendBroadcast(intent);

3.动态注册广播接收器.(所有能接收该信息的接收器都必须为LocalBroadcastManager的实例)


IntentFilter filter=new IntentFilter();
    filter.addAction("..............................");
    localBroadcastManager.registerReceiver(new MyBroadCastReceiver(),filter);
Broadcast 广播是 Android 系统中的一种重要的组件通信方式,它可以让应用程序之间进行消息传递,从而实现应用程序之间的数据交换和功能协同。广播可以被用来处理一些系统事件或应用程序内部的特定事件。在本篇文章中,我们将学习如何在 Android 应用程序中使用广播。 一、广播的基本概念 广播是指一种可以跨应用程序发送和接收消息的机制,它允许应用程序向全局范围内的其他应用程序通知某些事件的发生。Android 中的广播可以分为两类: 1.标准广播(Normal Broadcast):这种广播是完全异步的,所有的接收者都会在同一时刻接收到广播消息,因此它们之间没有任何优先级的区别。使用标准广播时,所有接收者都无法终止广播的传播,这也是标准广播的一个缺点。 2.有序广播(Ordered Broadcast):这种广播是同步执行的,所有的接收者都是按照优先级顺序依次接收广播消息的。在广播传递过程中,每个接收者都可以截断广播的传播,使得后面的接收者无法收到广播消息。如果某个接收者截断了广播的传播,那么其后面的接收者就无法收到广播消息。这种广播的优先级由高到低依次为:1000、500、0、-500、-1000。 二、发送和接收广播 1.发送广播 在 Android 应用程序中,我们可以通过以下代码来发送广播: ```java Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); ``` 上述代码中,我们首先创建了一个 Intent 对象,然后将其 action 设置为 "com.example.broadcasttest.MY_BROADCAST",这个 action 可以自己定义。最后,我们调用了 sendBroadcast() 方法来发送广播。 2.接收广播 要接收广播,需要在代码中注册一个 BroadcastReceiver 对象,并在其 onReceive() 方法中处理广播消息。以下是一个简单的例子: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } } ``` 在上述代码中,我们创建了一个 MyBroadcastReceiver 类,并实现了其 onReceive() 方法。当收到广播消息时,系统会自动调用该方法,并将广播消息以 Intent 对象的形式传递给该方法。在 onReceive() 方法中,我们可以根据 Intent 对象中携带的信息来进行相应的处理,例如弹出一个 Toast 提示框。 3.注册广播接收器 在 Android 应用程序中,我们需要使用 IntentFilter 对象来指定要接收的广播类型。以下是一个注册广播接收器的例子: ```java MyBroadcastReceiver receiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.MY_BROADCAST"); registerReceiver(receiver, intentFilter); ``` 在上述代码中,我们首先创建了一个 MyBroadcastReceiver 对象,然后创建了一个 IntentFilter 对象,并将要接收的广播类型设置为 "com.example.broadcasttest.MY_BROADCAST"。最后,我们调用 registerReceiver() 方法来注册广播接收器。 4.注销广播接收器 当我们不再需要接收某个广播时,应该及时将其注册的广播接收器进行注销。以下是一个注销广播接收器的例子: ```java unregisterReceiver(receiver); ``` 在上述代码中,我们调用 unregisterReceiver() 方法来注销广播接收器。 三、有序广播的使用 有序广播可以让我们按照优先级顺序接收广播消息,并且可以截断广播的传播。以下是一个有序广播的例子: ```java Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendOrderedBroadcast(intent, null); ``` 在上述代码中,我们调用了 sendOrderedBroadcast() 方法来发送有序广播。由于没有指定接收者的权限,因此我们将其设置为 null。 接下来,我们需要在代码中注册一个 BroadcastReceiver 对象,并在其 onReceive() 方法中处理广播消息。以下是一个简单的例子: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String msg = getResultData(); Toast.makeText(context, msg + " Received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); setResultData("Hello MainActivity"); } } ``` 在上述代码中,我们首先调用 getResultData() 方法来获取上一个接收者设置的数据,然后弹出一个 Toast 提示框,并将自己的数据设置为 "Hello MainActivity"。 接下来,我们需要指定广播接收者的优先级。在 AndroidManifest.xml 文件中,我们可以使用 priority 属性来设置广播接收者的优先级。以下是一个简单的例子: ```xml <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter> <priority android:priority="1000" /> </receiver> ``` 在上述代码中,我们将 MyBroadcastReceiver 类注册为广播接收者,并将其优先级设置为 1000。 为了演示有序广播的效果,我们可以再注册一个 BroadcastReceiver 对象,并将其优先级设置为 500。以下是一个简单的例子: ```java public class AnotherBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String msg = getResultData(); Toast.makeText(context, msg + " Received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show(); setResultData("Hello MainActivity"); } } ``` 在上述代码中,我们将 AnotherBroadcastReceiver 类注册为广播接收者,并将其优先级设置为 500。 最后,我们在 AndroidManifest.xml 文件中注册这两个广播接收者,代码如下: ```xml <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter> <priority android:priority="1000" /> </receiver> <receiver android:name=".AnotherBroadcastReceiver"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter> <priority android:priority="500" /> </receiver> ``` 在上述代码中,我们将 MyBroadcastReceiver 和 AnotherBroadcastReceiver 类都注册为广播接收者,并指定了它们的优先级。 在执行上述代码后,我们可以看到,在发送广播时,首先会将广播消息发送给优先级为 1000 的 MyBroadcastReceiver 类,然后再发送给优先级为 500 的 AnotherBroadcastReceiver 类。在 MyBroadcastReceiver 类的 onReceive() 方法中,我们可以获取到 AnotherBroadcastReceiver 类设置的数据,然后弹出一个 Toast 提示框,并将自己的数据设置为 "Hello MainActivity"。最后,我们可以看到,弹出的 Toast 提示框中显示的内容为 "Hello MainActivity Received in MyBroadcastReceiver",这表明 MyBroadcastReceiver 类成功地截断了广播的传播。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值