第八章-Android广播机制

Broadcast Receiver是Andriod四大组件之一(Activity,Service,Broadcast Receiver,Content Providers),主要是用于广播消息和接受消息。例如:系统在运行过程中,会发生很多事件,系统为了让其他应用知道系统发生了这个事件,会发送一个对应该事件的广播,比如:电量改变、收到短信、拨打电话、屏幕解锁、系统开机,应用只要注册一个广播接收者,就可以接收到系统发出的广播。

1、注册广播有两种方式(静态注册,动态注册)

a、静态注册:

第一步:创建一个java类型,继承BroadcastReceiver。

public class CallReceiver extends BroadcastReceiver {
    //收到广播时调用
    @Override
    public void onReceive(Context context, Intent intent) {
        //取出广播中的号码
        String number = getResultData();
        String newNumber = "17951" + number;
        //把修改后的号码放入广播中
        setResultData(newNumber);   
        //拦截是无效的
        abortBroadcast();
    }
}

第二步:在清单文件(AndroidManifest.xml)中配置Receiver的标签

<receiver android:name="com.itheima.ipdialer.CallReceiver">
  <intent-filter >
    <action android:name="android.intent.action.NEW_OUTGOINGCALL"/>
  </intent-filter>
</receiver>

b.动态注册(推荐)

第一步:创建一个BroadcastReceiver。(会自动在清单文件中生成_Receiver标签
_image.png
第二步:发送广播

//  2.发送广播
Intent intent = new Intent();
intent.setAction("a");
sendBroadcast(intent);

第三步:使用代码直接注册

IntentFilter a = new IntentFilter("a");
//注册广播接收者
registerReceiver(new MyReceiver(),a);

2、有序和无序

自定义广播(有序的广播,无序的广播)

  1. 无序的广播,通过调用sendBroadcast方法进行发送,所有注册的,同时获取到。通过调用setResultData方法进行,设置值。
  2. 有序的广播,通过sendOrderedBroadcast方法发送,
    1. 配置优先级:intentFilter.setPriority(1000),值越大越先获取,值取值范围【-1000,1000】,
    2. 可以通过调用abortBroadcast()方法,进行拦截,不在继续广播。通过调用setResultData方法进行,设置值。

有序广播

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        动态注册
        register();
        findViewById(R.id.btn_send).setOnClickListener(view -> {
//            1.发送有序广播
            Intent intent = new Intent();
            intent.setAction("a");
            sendOrderedBroadcast(intent,null);
        });
    }
    void register(){
//        动态注册广播接收者1
        IntentFilter a1 = new IntentFilter("a");
        a1.setPriority(333);//顺序1
        registerReceiver(new MyReceiver1(),a1);
//        动态注册广播接收者2
        IntentFilter a2 = new IntentFilter("a");
        a2.setPriority(111);//顺序3
        registerReceiver(new MyReceiver2(),a2);
//        动态注册广播接收者3
        IntentFilter a3 = new IntentFilter("a");
        a3.setPriority(222);//顺序2
        registerReceiver(new MyReceiver3(),a3);
    }

广播实际上就是由系统广播或自定义广播通过将要发送的信息和用于过滤的信息封装在Intent对象中
通过调用sendOrderBroadcast()方法将Intent的发送出去。
当Intent发送过后,所有已注册的BroadcastReceiver会通过IntentFilter中信息与该Intent比对,如果一致就调用该BroadcastReceiver的onReceive(Context context, Intent intent) 方法。

拦截广播

image.png

指定广播

**设置某个广播接收者一定可以接收到广播,**在广播发送时设置参数

sendOrderedBroadcast(intent,null,new MyReceiver2(),null,0,null,null);

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肉丝不切片

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

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

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

打赏作者

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

抵扣说明:

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

余额充值