有关BroadcastReceiver一些记录

相信我们对广播并不陌生,作为Android四大主键之一,一定有其非常重要的作用。这篇Blog就记录一些广播中常用的方法,步骤。

关键点:

  • 接受广播,主要由一个IntentFilter、一个自定义的广播监听类、registerReceiver方法完成;
  • 发送广播,一个包含action的intent,sendBroadcast方法实现;
  • 静态注册和动态注册广播
  • 本地广播,挺关键
  • 广播的类型,标准广播,有序广播

OK,按照关键点,一个个来看。

一、广播的类型

标准广播
完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。

有序广播
同步执行的广播,我们可以控制广播在哪里中断

二、下面就来看下广播的监听

动态注册广播监听

MainActivity中,通过如下代码,就可以动态注册一个广播监听,代码中intentFilter中的action是监听网络连接状态的

IntentFilter mIntentFilter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");//网络监听的action
       NetWorkBroadcast mNetWorkBroadcast=new NetWorkBroadcast();
       registerReceiver(mNetWorkBroadcast,mIntentFilter);

NetWorkBroadcast是我们自定义的一个广播监听者

public class NetWorkBroadcast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo=manager.getActiveNetworkInfo();

        //判断当前是否有网络
        if(networkInfo!=null && networkInfo.isAvailable()){
            Toast.makeText(context, "network is available",
                    Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(context, "network is unavailable",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

OK,上面是动态注册广播监听者,下面看如何静态注册

<!--静态注册BootCompleteReceive,监听开机启动-->
        <receiver android:name=".broadcast.BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

上面的广播是我们定义的另外一个广播监听器,其作用是监听开机启动,即在开机后会执行我们BootCompleteReceiver中的onReceiver方法

public class ReceiveBroadcast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

三、发送广播

通过如下代码我们就可以成功发送一个广播,只要我们按照上面的方法,动态或者静态的注册一个广播,该广播的action匹配下面的intent中的action,就可以成功监听下面发出的这个广播

 Intent intent = new Intent("com.wj.broadcast.ReceiveBroadcast");
        sendBroadcast(intent);

四、接下来简单看一下有序广播的使用

我们直接说跟上面的不同,首先发送广播的时候是通过

sendOrderedBroadcast(intent,null);

发送,并不是上面的sendBroadcast

其次,在静态注册的广播的时候,我们给起设置优先级,那么发出上面的有序广播后,下面广播接受者会优先接收到这个广播

 <receiver android:name=".broadcast.ReceiveBroadcast">
            <!--android:priority广播执行的优先级-->
            <intent-filter android:priority="100">
                <action android:name="com.wj.broadcast.ReceiveBroadcast"/>
            </intent-filter>
        </receiver>

我们可以在优先接受到的广播中中断该广播的传递,这样有序广播就不会在继续传递下去

public class ReceiveBroadcast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();

        //截断广播,不允许广播继续传播
        abortBroadcast();
    }
}

四、看一下关键的本地广播
我们当然不希望我们应用程序中发出的广播被别人轻易的接受,那么我们使用本地广播,其他应用程序就不会接受到我们发出的广播,这样就保证了我们广播数据传递的安全

看如何实现:
我们需要一个系统自带的LocalBroadcastManager 类来管理我们的广播

 private LocalBroadcastManager localBroadcastManager;

发送广播的时候:

Intent intent = new Intent("com.wj.broadcast.ReceiveBroadcast");
localBroadcastManager.sendBroadcast(intent);

接收广播的时候

 //动态注册
        mIntentFilter=new IntentFilter("com.wj.broadcast.ReceiveBroadcast");
        receiveBroadcast=new ReceiveBroadcast();
        localBroadcastManager.registerReceiver(receiveBroadcast,mIntentFilter);

ok,这样我们就实现了本地广播的发送和接收!

ps:上面用到网络、开机启动的监听,都需要加入系统权限

<!--监听网络状态权限-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <!--监听开机启动权限-->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

ps:在动态注册广播的时候,不要忘记在活动结束的时候取消广播的注册

 @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册的广播要取消注册
        unregisterReceiver(mNetWorkBroadcast);
    }

本地广播类似,也要取消注册.

欢迎大家留言讨论,指教!!!

你可能感兴趣的:(有关BroadcastReceiver一些记录)