BroadcastReceiver

本文详细介绍了Android中的广播机制,包括广播的注册方式、发送不同类型广播的方法及其特点。具体讲解了静态与动态注册的区别,普通广播、有序广播及粘性广播的工作原理,并提供了具体的代码实例。

(广播是android四大组件之一)
广播必须要注册才能接收,注册广播接收器BroadcastReceiver的方式有两种:
1.静态注册:在AndroidManifest.xml文件中注册。

<!-- 注册广播 -->
        <receiver android:name="broadcast.CommonBroadCast">
            <intent-filter>
                <!-- 为广播设置一个频率 -->
                <action android:name="com.ybj.NORMAL_BROADCAST"/>
            </intent-filter>
        </receiver>

2.动态注册:在代码中指定广播地址并注册,通常是在Activity或Service注册广播。注意:如果有带有优先级的静态注册,则注明优先级的广播接收为最先;如果是没有优先级的静态注册,则代码注册的广播接收为最先。

//动态注册广播
            IntentFilter filter = new IntentFilter();
            filter.addAction("com.ybj.NORMAL_BROADCAST");
            CommonBroadCast receiver = new CommonBroadCast();
            registerReceiver(receiver, filter);

如果你想注销广播的话,方法如下:

//注销广播
unregisterReceiver(receiver);

**下面介绍几种类型广播的发送
1.普通广播
接收者之间互不影响,均能无等待接收,接收者无法影响广播发送。

BroadCastActivity.java中:

//发送普通广播
            Intent intent = new Intent();
            intent.setAction("com.ybj.NORMAL_BROADCAST");
            intent.putExtra("info", "content");
            sendBroadcast(intent);

CommonBroadCast.java

/**
 * 接收普通广播
 * @author Administrator
 *
 */
public class CommonBroadCast extends BroadcastReceiver {

    /**
     * 广播处理业务的方法
     * 处理简单业务
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("广播接收到", info);
    }
}

运行结果:
这里写图片描述

2.有序广播
广播先发送到优先级高的接收者,高优先级接收者可以终止广播,并能向优先级低的接收者传递信息。
(1)
BroadCastActivity.java中:

//发送有序广播
            Intent intent = new Intent();
            intent.setAction("com.ybj.ORDER_BROADCAST");
            intent.putExtra("info", "content");
            //null表示不要求接收者声明指定权限
            sendOrderedBroadcast(intent, null);

在AndroidManifest.xml注册广播接收者:

<!-- android:priority : 配置广播接收器的优先级(-1000,1000) -->
        <receiver android:name="broadcast.OrderBroadcast1" >
            <intent-filter android:priority="100">
                <!-- 为广播设置一个频率 -->
                <action android:name="com.ybj.ORDER_BROADCAST" />
            </intent-filter>
        </receiver>
        <receiver android:name="broadcast.OrderBroadcast2" >
            <intent-filter android:priority="200">
                <!-- 为广播设置一个频率 -->
                <action android:name="com.ybj.ORDER_BROADCAST" />
            </intent-filter>
        </receiver>

OrderBroadcast1.java

public class OrderBroadcast1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收者1接收到有序广播", info);
    }

}

OrderBroadcast2.java

public class OrderBroadcast2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收者2接收到有序广播", info);
    }

}

运行结果:
这里写图片描述

(2)
(与(1)对照)在这里如果OrderBroadcast2.java是这样写的:

public class OrderBroadcast2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收者2接收到有序广播", info);

        //优先级别高的接收者结束这个广播
        this.abortBroadcast();
        Log.e("接收者2结束有序广播", info);
    }

}

则运行结果为:
这里写图片描述

(3)
(与(1)对照)如果OrderBroadcast1.java是这样写的:

public class OrderBroadcast1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收者1接收到有序广播", info);
        //接收优先级别高的接收者发送的内容
        Bundle bundle = getResultExtras(false);
        String msg = bundle.getString("result");
        Log.e("接收者1接收到优先级别高的接收者发送的内容", msg);
    }

}

如果OrderBroadcast2.java是这样写的:

public class OrderBroadcast2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收者2接收到有序广播", info);

        //优先级别高的接收者发送内容给优先级别低的接收者
        Bundle extras = new Bundle();
        extras.putString("result", "接收者2发送的content");
        setResultExtras(extras);
    }

}

则运行结果为:
这里写图片描述

(4)
(与(1)对照)如果BroadCastActivity.java中是这样写的:

//发送有序广播
            Intent intent = new Intent();
            intent.setAction("com.ybj.ORDER_BROADCAST");
            intent.putExtra("info", "content");
            //在这里指定权限不为空,接收者接收需要声明指定权限
            sendOrderedBroadcast(intent, "com.ybj.permission");
            break;

清单文件AndroidManifest.xml中需要配置权限接收者才能收到,如果不配置则接收不到:

<!-- 定义一个权限 -->
    <permission android:name="com.ybj.permission"></permission>
    <!-- 使用这个权限 -->
    <uses-permission android:name="com.ybj.permission"/>

运行结果与(1)相同。

3.粘性广播
intent会保持到广播事件结束,没有所谓的10秒限制,10秒限制是指普通的广播如果执行onReceive()时间超过10秒,系统会将这个广播置为可以干掉的candicate,一旦资源不够时就会干掉这个广播不让它执行。

粘性广播需要在AndroidManifest.xml中设置权限:

<!-- 粘性广播权限 -->
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>

BroadCastActivity.java中:

//发送粘性广播
            Intent intent = new Intent();
            intent.setAction("com.ybj.STICKY_BROADCAST");
            intent.putExtra("info", "content");
            sendStickyBroadcast(intent);

StickyBroadcast.java:

public class StickyBroadcast extends BroadcastReceiver {

    private boolean flag = true;
    private int i = 0;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String info = intent.getStringExtra("info");
        Log.e("接收到粘性广播内容", info);
        Log.e("粘性广播接收", "开始。。50秒后结束");

        new Thread(new Runnable(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while(flag){
                    Log.e("i=", "" + i++);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if(i == 50){
                        flag = false;
                        Log.e("粘性广播接收", "广播终止了");
                    }
                }
            }

        }).start();

    }

}

在AndroidManifest.xml中注册接收者:

<receiver android:name="broadcast.StickyBroadcast" >
            <intent-filter>
                <!-- 为广播设置一个频率 -->
                <action android:name="com.ybj.STICKY_BROADCAST" />
            </intent-filter>
        </receiver>

运行结果为:
这里写图片描述
……
这里写图片描述

这里说一下,广播接收者中不要创建线程或者做一些耗时操作,否则广播结束时会造成异常。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值