BroadcastReceiver

第六章 BroadcastReceiver

6.1 BroadcastReceiver简介

​ 广播是一种运用在引用程序之间传递消息的机制,广播接收者时android四大组件之一。

​ 当android系统产生一个广播事件时,可以有多个BroadcastReceiver接收并进行处理,这些BroadcastReceiver只需要在清单文件或者代码中进行注册并指定要接收的广播事件,然后创建一个类继承自BroadcastReceiver类,重写onReceive()方法,在方法中处理广播事件即可。

6.2 BroadcastReceiver入门

6.2.1 BroadcastReceiver的创建

new -> other -> BroadcastReceiver

下面的Exported复选框用于选择是否接收当前程序外的广播,Enable复选框用于选择广播接收者是否可以由系统实例化。

创建后代码如下所示:

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

onReceive方法用于实现广播接收者的相关操作,由于该方法尚未实现,因此会抛出异常,在实现该方法时删除异常即可。

通过上面的方法创建广播接收者,Studio工具会自动在AndroidManifest.xml文件中注册广播接收者。不需要手动添加,上述广播接收者的注册方式时静态注册,这种静态注册的特点是无论应用程序是否处于运行状态,广播接收者都会对程序进行监听。

静态注册是在清单文件中注册 , 动态注册是在Activity中代码注册,但当Activity销毁时广播接收者也随之移除。

public class MainActivity extends AppCompatActivity{

    private MyReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化广播接收者
        receiver = new MyReceiver();
        //实例化过滤器并设置要过滤的广播
        String action = "android.provider.Telephoney.SMS_RECEIVED";
        IntentFilter intentFilter = new IntentFilter(action);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}

6.3 自定义广播

6.3.1 自定义广播的发送与接收

安卓中自定义了很多广播类型,只需要创建对应的广播接收者接收即可。当系统提供的广播不能满足需求时,可自定义广播,同时需要编写对应的广播接收者。

下面就创建并发送了了一个Help_Stitch类型的广播事件,光有广播事件还不行,必须要有对应的广播接收者。我们创建一个广播接收者后会自动注册,但是广播接收者接收的广播类型要我们自己设置。如下

public void click(View view) {
        Intent intent = new Intent();
        intent.setAction("Help_Stitch");
        sendBroadcast(intent);
    }
<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
    	<!--下面是设置接收的广播类型-->
            <intent-filter>
                <action android:name="Help_Stitch"></action>
            </intent-filter>
        </receiver>

6.4 广播的类型

6.4.1 有序广播和无需广播
  1. 有序广播

    无序广播时完全异步执行的发送广播时,所有监听此广播的广播接收者都会收到此广播消息,但接收和执行的顺序不确定。无序广播的效率比较高,但无法被拦截

  2. 有序广播

    有序广播是按照接收者声明的优先级被依次接收,发送广播时只有一个广播接收者会收到消息,当在此接收者执行完毕后才会继续传递。相较于无序广播,有序广播效率较低,但是可被拦截的。

    优先级:在标签中通过属性设置优先级,值越大优先级越高。优先级相同时先注册的接收者先接收

    sendOrderedBroadcast(intent,null);//发送有序广播
    abortBroadcast();   //拦截广播,只能拦截有序广播,拦截无序广播也能成功拦截,但再次发送该无需广播时会报错
    

    指定广播接收者:在发送有序广播时要指定某个接收者一定要接收到广播,无论它的优先级多低

    Intent intent = new Intent();
            intent.setAction("order_broadcast");
            OrderReceiver2 receiver2 = new OrderReceiver2();
            sendOrderedBroadcast(intent,null,receiver2,null,0,null,null);
    
    
    
    
    可以看到虽然事件被拦截了,但是我们指定的接收者仍然接收到了广播
    

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little BigUs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值