android之BroadcastReceiver(广播接收者)

BroadcastReceiver本意是广播接收者。这个也是android四大组件之一,广播其实我们也不难理解它,打个简单的比方,比如我们上课时,只要听到下课的铃声,这说明就要下课。在安卓中,广播是全局性的,每个应用都有可能接受到。下面就学习下怎么用广播接受者:

接下来我们就学习以下知识

  1. 静态注册广播
  2. 动态注册广播
  3. 普通广播
  4. 有序广播

静态注册广播

静态注册就是在清单文件里面注册

   <receiver
            android:name=".MyReceiver">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver">
                </action>
            </intent-filter>
        </receiver>

动态注册广播

就是通过java代码去注册而不是在清单文件里面去配置

  MyReceiver receiver=new MyReceiver();//广播接受者实例
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("edu.jju.broadcastreceiver");
        registerReceiver(receiver,intentFilter);

注册广播就是这两种方式。接下来我们重点学习下普通广播跟有序广播

普通广播

1, 我么先定义一个类MyReceiver去继承BroadcastReceiver。并重写里面的方法

代码如下:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"我接受到广播啦!!!",Toast.LENGTH_SHORT).show();
    }

}

当有广播时,就会调用onReceive方法

MainActivity.java代码如下:


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

public class MainActivity extends AppCompatActivity {

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

    }

    /**
     * 这是绑定按钮添加的事件
     * @param view
     */
    public void send(View view) {

        /*
        这是通过静态注册的广播
         */
        Intent intent = new Intent();
        intent.setAction("edu.jju.broadcastreceiver");
        sendBroadcast(intent);//发送普通广播
    }
}

运行结果:

这里写图片描述

也可以通过动态注册来实现,可以不需要在清单文件配置。修改的代码如下:

   /**
     * 这是绑定按钮添加的事件
     * @param view
     */
    public void send(View view) {

        MyReceiver receiver = new MyReceiver();//广播接受者实例
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("edu.jju.broadcastreceiver");
        registerReceiver(receiver, intentFilter);
        Intent intent = new Intent();
        intent.setAction("edu.jju.broadcastreceiver");
        sendBroadcast(intent);//发送普通广播
    }

运行效果是一样的

有序广播

接下来我们定义四个广播来演示下 A B C D,然后它们是接收相同的广播。

       <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>


        <receiver android:name=".MyReceiverA">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverB">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverC">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

可以看到,我们是通过静态注册的方式,而且是接受相同的广播, 在每个广播接收者中打印log

然后运行:

这里写图片描述

可以看到,我们发送一条广播,广播接收者都接受到了该广播。默认的是按在清单文件注册顺序接受的。我们可以改它们的优先级

修改代码如下

     <receiver android:name=".MyReceiver">
            <intent-filter android:priority="100">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>


        <receiver android:name=".MyReceiverA">
            <intent-filter android:priority="200">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverB">
            <intent-filter android:priority="50"> 
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverC">
            <intent-filter android:priority="300">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

优先级设置为MyReceiver 100 , MyReceiverA 200 , MyReceiverB 50 , MyReceiverC 300

再运行下

这里写图片描述

可以看到优先级高的,先接收到广播

我们也可以截断这条广播,我们就在MyReceiverA 这里截断试下

修改下MyReceiverA 代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiverA extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("TAG", " MyReceiverA 广播 ");
        abortBroadcast();//截断广播
    }
}

再运行下:
这里写图片描述

可以看到只有两个接收到了该广播,说明是被截断了

总结:

写的不是太好,只是讲了怎么用,我也是一名初学者。争取下次博客结合案例来写。

源码下载

https://github.com/songshuilin/AndroidForBlog/tree/master/androidforbroadcastreceiver

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值