zoukankan      html  css  js  c++  java
  • Android中广播接收者BroadcastReceiver详解

    1. 接收系统的广播步骤

    (1)  新建一个类继承BroadcastReceiver

    以监听sd卡状态的广播接收者为例

     1 public class SdCardBroadcastReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         String action = intent.getAction();
     6         if("android.intent.action.MEDIA_MOUNTED".equals(action)){
     7             System.out.println("sd卡已挂载");
     8         }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
     9             System.out.println("sd卡已卸载");
    10         }
    11     }
    12 
    13 }

    形象一点的比喻, 这一步相当于买了个收音机

    (2) 在清单文件中注册

    1 <!-- 相当于装电池 -->
    2         <receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver">
    3             <!-- 相当于调频道 -->
    4             <intent-filter>
    5                 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
    6                 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
    7                 <data android:scheme="file"/>
    8             </intent-filter>
    9         </receiver>

    这一步相当于装电池

    (3)  在清单文件中添加意图过滤器,action里写监听的内容

    1  <!-- 相当于调频道 -->
    2             <intent-filter>
    3                 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
    4                 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
    5                 <data android:scheme="file"/>
    6             </intent-filter>

    这一步相当于调频道了

    2. 发送自定义的无序广播

    (1) 发送广播

     1 public void startBroadcast(View view){
     2         //开启广播
     3         //创建一个意图对象
     4         Intent intent = new Intent();
     5         //指定发送广播的频道
     6         intent.setAction("com.example.BROADCAST");
     7         //发送广播的数据
     8         intent.putExtra("key", "发送无序广播,顺便传递的数据");
     9         //发送
    10         sendBroadcast(intent);
    11     }

    (2) 接收广播

    新建一个类,继承BroadcastReceiver

     1 public class UnorderedReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         String action = intent.getAction();
     6         
     7         String data = intent.getStringExtra("key");
     8         
     9         System.out.println("接受到了广播,action:"+ action +",data:"+data);
    10         
    11         //接受到了广播,action:com.example.BROADCAST,data:发送无序广播,顺便传递的数据
    12     }
    13 
    14 }

    记得在清单文件中进行注册

    1 <receiver android:name="com.example.selfreceiver.UnorderedReceiver">
    2             <intent-filter>
    3                 <action android:name="com.example.BROADCAST"/>
    4             </intent-filter>
    5         </receiver>

    打印出的结果:

    3. 发送自定义的有序广播

    (1) 发送广播

     1 // 发送有序广播
     2     public void sendOrderedBroad(View view) {
     3         Intent intent = new Intent();
     4         intent.setAction("com.example.ORDERED");
     5         // 发送无序广播
     6         sendOrderedBroadcast(intent,//意图动作,指定action动作
     7                 null, //receiverPermission,接收这条广播具备什么权限
     8                 new FinalReceiver(),//resultReceiver,最终的广播接受者,广播一定会传给他
     9                 null, //scheduler,handler对象处理广播的分发
    10                 0,//initialCode,初始代码
    11                 "每人发10斤大米,不得有误!", //initialData,初始数据
    12                 null//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
    13                 );
    14     }

    在上面的代码中,广播发送者发送了一条广播:"每人发10斤大米,不得有误!"

    (2) 接收广播

    新建一个类, 继承BroadcastReceiver,并在清单文件中进行注册

    以下是所有的广播接收者在清单文件中的注册

    权限从-1000 至 1000

    1) 权限高的广播接收者可以修改广播,甚至可以终止广播

    权限高的广播接收者1:

     1 public class ShengReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         
     6         //获取广播的数据
     7         String data = getResultData();
     8         
     9         //修改
    10         setResultData("中央下达福利,每人5斤大米");
    11         
    12         System.out.println("省政府收到指示, data : "+data);
    13     }
    14 
    15 }

    在这里, 这个接收者修改广播为: "中央下达福利,每人5斤大米"

    权限低的广播接收者

     1 public class PeopleReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         //获取广播的数据
     6         String data = getResultData();
     7         System.out.println("老百姓收到福利,感谢党, data : "+data);
     8     }
     9 
    10 }

    这样,在控制台打印出来的信息为:

    权限低的接收者 接收到的广播就是修改后的了

    2) 终止广播

    权限高的广播接收者:

     1 public class ShengReceiver extends BroadcastReceiver {
     2 
     3     @Override
     4     public void onReceive(Context context, Intent intent) {
     5         
     6         //获取广播的数据
     7         String data = getResultData();
     8         
     9         //也可以终止广播,权限小的接收者就接收不到广播了
    10         abortBroadcast();
    11         
    12         System.out.println("省政府收到指示, data : "+data);
    13     }
    14 
    15 }

    控制台打印:

    权限小的就接收不到广播了....

    (3) resultReceiver

    可以在广播发送者的应用中建一个resultReceiver, 用于接收最终到达的广播,

    无论广播是否终止,都会被resultReceiver接收

    1 public class FinalReceiver extends BroadcastReceiver {
    2 
    3     @Override
    4     public void onReceive(Context context, Intent intent) {
    5         String resultData = getResultData();
    6         System.out.println("人民收到的最终福利是: "+ resultData);
    7     }
    8 
    9 }

    控制台打印信息:

    (终止广播后):

    (修改广播后):

    4. 补充:

    有序广播和无序广播的区别:

    有序广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent);

    有序广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);

  • 相关阅读:
    取石子(斐波那契博弈)
    Kindergarten(网络流解法)
    最大团的一些定理
    Escape(多记一个方向状态的BFS)迷宫逃脱
    网络流的一些定理
    线段树维护动态连续子段HDU1540
    最大流Dinic(模板)
    MCMF最大流最小割(模板)Dijkstra负权优化
    Exchanging Gifts--2019CCPC哈尔滨 E题
    A<=B的前提下全排列A使答案尽量大
  • 原文地址:https://www.cnblogs.com/wanghaoyuhappy/p/5292733.html
Copyright © 2011-2022 走看看