天天看点

Android中的广播(Broadcast)简介广播分有序广播和无需广播

简介

      广播,即就类似于我们生活中的电台广播一样,只负责说,不管你听不听<你听,就做出相应的响应;不听,也没有人强迫你>

     广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的;

     Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

     Android广播机制包含三个基本要素:广播(Broadcast) - 用于发送广播;广播接收器(BroadcastReceiver) - 用于接收广播;意图内

容(Intent)-用于保存广播相关信息的媒介。Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对

发送出来的Broadcast进行过滤接受并响应的一类组件。

广播分有序广播和无需广播

有序广播:

     故名思义:是有顺序的,是按照我们定义的广播接受者的优先级进行接受,优先级高的最先接受到发送的广播,优先级低的较晚;当然优先级高的可以中断广播的发送,则优先级低的则不能接受到广播

接受广播App:

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

        if (intent != null) {
            if ("Receiver".equals(intent.getAction())) {
                String resultData = getResultData();
                Log.i("==Receiver==One",resultData);
                setResultData("领导发1000红包");
            }
        }

    }
}


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

        if (intent != null) {
            if ("Receiver".equals(intent.getAction())) {
                String resultData = getResultData();
                Log.i("==Receiver==Two",resultData);
                abortBroadcast();
            }
        }
    }
}

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

        if (intent != null) {
            if ("Receiver".equals(intent.getAction())) {
                Log.i("==Receiver==Three", getResultData() + "");
            }
        }

    }
}
           

 接受广播App清单文件注册:

<uses-permission android:name="com.android.permission.RECEIVER"/>
<permission android:name="com.android.permission.RECEIVER"/>
<!--  自定义发送方权限(谁有权给我发送广播) -->

<receiver
   android:name=".OneBroadcastReceiver"
   android:permission="com.android.permission.SEND"> // 发送方的权限
   <intent-filter android:priority="1000">
        <action android:name="Receiver"/>
   </intent-filter>
</receiver>

<receiver
    android:name=".TwoBroadcastReceiver"
    android:permission="com.android.permission.SEND">
    <intent-filter android:priority="100">
         <action android:name="Receiver"/>
    </intent-filter>
</receiver>

<receiver
    android:name=".ThreeBroadcastReceiver"
    android:permission="com.android.permission.SEND">
   <intent-filter android:priority="10">
          <action android:name="Receiver"/>
    </intent-filter>
</receiver>
           

发送广播App:

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

        if (intent != null) {
            if ("Receiver".equals(intent.getAction())) {
                Log.i("==Receiver==Final",getResultData());
            }
        }
    }
}
           

发送广播App清单文件配置:

<uses-permission android:name="com.android.permission.SEND"/>
<permission android:name="com.android.permission.SEND"/>
<!-- 发送方的权限<接受方具有该权限的广播才能接受>  -->


<receiver
    android:name=".FinalBroadcastReceiver">
     <intent-filter>
           <action android:name="Receiver"/>
      </intent-filter>
</receiver>
           

发送广播:

Intent intent = new Intent();
  intent.setAction("Receiver");
  //sendOrderedBroadcast(intent, "com.android.permission.RECEIVER");

  sendOrderedBroadcast(intent,                  //意图动作,指定action动作
            "com.android.permission.RECEIVER", //receiverPermission,接收这条广播具备什么权限
             new FinalBroadcastReceiver(), //resultReceiver,最终的广播接受者,广播一定会传给他
             null,                        //scheduler,handler对象处理广播的分发
              0,                         //initialCode,初始代码
              "领导发2000元红包",         //initialData,初始数据
              null);//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
           

结果展示:

12-14 11:40:36.760 17537-17537/com.example.receiver I/==Receiver==One: 领导发2000元红包
// 权限高的先收到,低的后收到
12-14 11:40:36.764 17537-17537/com.example.receiver I/==Receiver==Two: 领导发1000红包
// 被拦截了的,无法收到 (Three就没有收到)
12-14 11:40:36.770 16848-16848/com.example.send I/==Receiver==Final: 领导发1000红包
// 被指定的最终广播,都会被收到

被指定的最终广播可以理解为: 我发出广播,希望知道最终的结果执行得如何;当然也可以不指定最终广播
           

无序广播:

与有序广播不同,是没有顺序的,只要注册了该类型,就可以接受该类型的广播,无先后顺序的

注意:

      1、在新版的,增加了权限的概念,只有具有某权限,才能接收到特定的广播《权限解释同上有序广播中的权限》;

      2、默认情况下,广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。否则将会出现ANR;

      3、可以使用LocalBroadcastManager类发送只限于应用内接受的广播           

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent();
intent.setAction("BroadcastReceiver");
localBroadcastManager.sendBroadcast(intent);
           

继续阅读