BroadcastReceiver

什么是广播
1.广播是安卓四大组件之一,全称BroadcastReceiver;
2.广播分为发送和接收方,就算没有接收方,发送方也会发送数据;
3.广播可以实现跨多个页面的数据通信;
4.广播可以实现跨进程(APP)间的数据通信。
注意:广播分为三个部分:
无序广播:所有监听此广播的接受者都能收到;
有序广播按照接受者的优先级,逐一传递,优先级最高的接收者先接收,如果不终止此广播,再往下传递;
粘滞广播;当广播发出后,如果系统没有接收者,会一直等待,直到有接收者为止。
准备工作:
创建两个Project(发送方SendBroadCastDemo和接收方ReceiverBroadCastDemo)
无序注册
1.静态
SendBroadCastDemo里设置Button按钮和点击事件自然不必多说,然后在MainActivity.java按钮点击事件中发送广播,代码如下:

package com.lenovo.sendbroadcastdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button sendBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindID();

        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送广播
                Intent intent = new Intent("com.test.receiver.action");
                sendBroadcast(intent,null);
            }
        });

    }

    private void bindID() {
        sendBtn = findViewById(R.id.send_btn);
    }
}

然后在ReceiverBroadCastDemo中新建类(MyReceiver1)继承BroadcastReceiver

package com.lenovo.receiverbroadcastdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("TAG", "Receiver1 = 11111111111111111111");
    }
}

重点在于AndroidManifest.xml中添加receiver标签

<receiver android:name=".MyReceiver">
     <intent-filter>
          <action android:name="com.test.receiver.action"/>//name的值必须与发送广播时Intent的值相同
     </intent-filter>
</receiver>//receiver标签位于application标签内

2.动态
动态注册相比较于静态注册,发送方SendBroadCastDemo的代码不变,不需要在AndroidManifest中设置receiver标签,转变为在接收方ReceiverBroadCastDemo的MainActivity中设置receiver标签对应的Java代码,示例如下:

package com.lenovo.receiverbroadcastdemo;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private MyReceiver receiver;
    private MyReceiver2 receiver2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //动态注册
        receiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.test.receiver.action");
        //动态注册广播接收器
        registerReceiver(receiver,intentFilter);
    }

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

动态注册的步骤一一对应receiver标签内的三层关系

receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.receiver.action");

有序注册
1.静态
相对于静态无序注册,首先需要将发送广播处的sendBroadcast改为sendOrderedBroadcast

//发送广播
Intent intent = new Intent("com.test.receiver.action");
sendOrderedBroadcast(intent,null);

在接收方ReceiverBroadCastDemo内新建类MyReceiver2继承BroadcastReceiver,然后在AndroidManifest中添加receiver标签,这里加上了优先级priority

<receiver android:name=".MyReceiver">
     <intent-filter android:priority="-1000">
          <action android:name="com.test.receiver.action"/>
     </intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
     <intent-filter android:priority="1000">
         <action android:name="com.test.receiver.action"/>
     </intent-filter>
</receiver>

2.动态
同样的,动态注册取消在AndroidManifest内的receiver标签,改为在MainActivity中写receiver标签对应的Java代码

package com.lenovo.receiverbroadcastdemo;

import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private MyReceiver receiver;
    private MyReceiver2 receiver2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //动态注册
        receiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.test.receiver.action");
        intentFilter.setPriority(-1000);
        //动态注册广播接收器
        registerReceiver(receiver,intentFilter);

        receiver2 = new MyReceiver2();
        IntentFilter intentFilter2 = new IntentFilter();
        intentFilter2.addAction("com.test.receiver.action");
        intentFilter2.setPriority(1000);
        registerReceiver(receiver2,intentFilter2);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
        unregisterReceiver(receiver2);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值