Adnroid四大组件之BroadCastReceive

 

BroadcastReceiver是Android四大组件之一。主要是用来接收广播事件。

1、广播的发送,主要有两种,有序广播和无序广播。

1.1 无序广播

sendBroadcast()方法发送的广播为无序广播。

无序广播可以被任何广播接受者接收到,优点是效率高。

发送一个广播,只要填写上广播对应的action,通过serBrocast()接口就可以实现了。

    private final String BROCAST_ACTION = "com.android.brocast.START";
 
            Intent intent = new Intent(BROCAST_ACTION);
            try {
                sendBroadcast(intent);
            } catch (Exception e) {
                Log.i(TAG, "send brocast fail!");
            }


1.2 有序广播

sendOrderedBrocast()方法发送的广播为有序广播。

有序广播是依次传播,例如有多个广播接受者 A,B,C,优先级是A>B>C。此时发送的广播会先把A接收到,在传递给B,最后传递给C。

每个广播接收者都有权利终止广播,例如B终止了广播,那么后面广播接受者C就无法接收到该条广播了。


1.2.1 在AndroidManifest.xml配置三个receiver。

接受有序广播,需要增加对应的权限,所有我们增加对应的权限

    <permission android:name="com.android.permission.RECEIVER_ORDER_BROADCAST" android:protectionLevel="normal" />
    <uses-permission android:name="com.android.permission.RECEIVER_ORDER_BROADCAST" /> 


给每个receiver设置优先级,即设置android:priority=""的值,值越小优先级越高。

       <receiver
            android:name="com.android.brocast.FirstReceiver" >
            <intent-filter>
                <action android:name="com.android.orderbroadcast.START" android:priority="400" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.android.brocast.SecondReceiver" >
            <intent-filter>
                <action android:name="com.android.orderbroadcast.START" android:priority="500" />
            </intent-filter>
        </receiver>
 
        <receiver
            android:name="com.android.brocast.ThirdReceiver" >
            <intent-filter>
                <action android:name="com.android.orderbroadcast.START" android:priority="600" />
            </intent-filter>
        </receiver>

1.2.2 分别实现对应的三个Receive

FirstRecveiver我们在第一个Receiver里面,增加一个bundle,通过setResultExtras()把数据传递下去。

package com.android.brocast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class FirstReceiver extends BroadcastReceiver {
    private final String TAG = "FirstReceiver";

    @Override
    public void onReceive(Context content, Intent intent) {
        if (intent == null) {
            XLog.i(TAG, "intent is null");
            return;
        }

        String action = intent.getAction();
        XLog.i(TAG, "onReceive() action = " + action);

        Bundle bundle = new Bundle();
        bundle.putString("name", "FirstReceiver");
        setResultExtras(bundle);
    }
}


在SecondRecveiver里面,通过getResultExtras()把FirstReceiver发生过来的数据获取出来。

同时调用abortBroadcast()方法,停止广播的继续发送。

package com.android.brocast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class SecondReceiver extends BroadcastReceiver {
    private final String TAG = "SecondReceiver";

    @Override
    public void onReceive(Context content, Intent intent) {
        if (intent == null) {
            XLog.i(TAG, "intent is null");
            return;
        }

        String action = intent.getAction();
        XLog.i(TAG, "onReceive() action = " + action);

        Bundle bundle = getResultExtras(true);
        String name = bundle.getString("name");
        XLog.i(TAG, "name = " + name);

        abortBroadcast();
    }
}


在ThirdReceiver里面增加对应的log信息,用来验证是否可以接受到对应的广播。

package com.android.brocast;

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

public class ThirdReceiver extends BroadcastReceiver {
    private final String TAG = "ThirdReceiver";

    @Override
    public void onReceive(Context content, Intent intent) {
        if (intent == null) {
            XLog.i(TAG, "intent is null");
            return;
        }
        String action = intent.getAction();
        XLog.i(TAG, "onReceive() action = " + action);
    }
}


1.2.3 在应用里面发送一个有序的广播
  这里面的权限和在androidmanifest要对应起来,不然接受者会接受不对广播。

private final String RECEIVER_PERMISSION = "com.android.permission.RECEIVER_ORDER_BROADCAST"; 
         .....
            Intent intent = new Intent(ORDER_BROADCAST_ACTION);
            try {
                XLog.i(TAG, "send order broadcast!");
                sendOrderedBroadcast(intent, RECEIVER_PERMISSION);
            } catch (Exception e) {
                XLog.i(TAG, "send order brocast fail!");
            }

1.2.4 当我们发送一个有序广播后,看下对应的输出log
03-23 11:57:13.631: V/bcDemo(7782): MainActivity onCreate()
03-23 11:57:13.631: V/bcDemo(7782): MainActivity onResume()
03-23 11:57:17.142: V/bcDemo(7782): MainActivity onClick()
03-23 11:57:17.142: V/bcDemo(7782): MainActivity send order broadcast!
03-23 11:57:17.148: V/bcDemo(7782): FirstReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:57:17.150: V/bcDemo(7782): SecondReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:57:17.150: V/bcDemo(7782): SecondReceiver name = FirstReceiver

可以看到优先级比较高的FrirstReceiver先收到广播,然后才是SecondReceiver。

同时可以看到,在FirstReceiver封装的数据,在SecondReceiver被接受到

由于我们在SecondReceiver把广播给停止了,所以ThirdReceive就接受不到对应的广播了


1.2.5 如果我们把SecondReceiver的abortBroadcast()这个给注释掉,ThirdReceive就可以接受到对应的广播了。对应的log如下:

03-23 11:59:06.609: V/bcDemo(7949): MainActivity onCreate()
03-23 11:59:06.609: V/bcDemo(7949): MainActivity onResume()
03-23 11:59:08.942: V/bcDemo(7949): MainActivity onClick()
03-23 11:59:08.942: V/bcDemo(7949): MainActivity send order broadcast!
03-23 11:59:08.951: V/bcDemo(7949): FirstReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:59:08.954: V/bcDemo(7949): SecondReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:59:08.954: V/bcDemo(7949): SecondReceiver name = FirstReceiver
03-23 11:59:08.957: V/bcDemo(7949): ThirdReceiver onReceive() action = com.android.orderbroadcast.START


2、 BroadcastReceiver有两种注册方法。

 

在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册

2.1 静态注册广播

在Androidmainfest.xml中注册(增加对应权限)同时写一个继承BrocastReceiver的类就可以了实现一个静态广播。

在receiver的 intent-filter这里需要写上对应要接收广播的action。同时根据不同广播的权限要求,添加对应的uses-permission

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
   <receiver android:name="com.android.brocast.BootReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
   </receiver>
 
 

BootReceiver.java,这个是继承BrocastReceiver的类,实现对应的onReceiver()方法。
package com.android.brocast;

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

public class BootReceiver extends BroadcastReceiver {
    private final String TAG = "BootReceiver";

    @Override
    public void onReceive(Context content, Intent intent) {
        if (intent == null) {
            return;
        }
        String action = intent.getAction();
        Log.i(TAG, "onReceive() action = " + action);
        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
            Log.i(TAG, "receiver android.intent.action.BOOT_COMPLETED brocast");
        }

    }

}

一个接收开关广播的静态广播接收器就完成了。


2.2 动态广播

动态广播是在接收广播的Activity或者Service通过registerReceiver()方法注册广播接收器。

一旦对应的Activity或者Service退出,BroadcastReceiver就无法再收到对应的广播了。

应用需要自己new一个intentFilter对象,里面添加需要监听的广播的action。同时需要new一个BrocastReceiver对象,用来处理广播接收到后的处理逻辑。

     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) {
                return;
            }


            String action = intent.getAction();
            if (BROCAST_ACTION.equals(action)) {
                XLog.i(TAG, "receiver com.android.brocast.START brocast");
            } else if (Intent.ACTION_CALL.equals(action)) {
                XLog.i(TAG, "receiver android.intent.action.CALL brocast");
            }


        }
    };


    private void registerBrocastReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_CALL);
        filter.addAction(BROCAST_ACTION);
        registerReceiver(mReceiver, filter);
    }

附件:对应的source code


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值