使用 BroadcastReceiver&&动态注册和注销 BroadcastReceiver&&BroadcastReceiver 的优先级

0、介绍

  • BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
  • 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
  • registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION))就会注册一个相应带着过滤器的receiver。(这里指明了action)

1、静态使用 BroadcastReceiver

  • MyBReceiver 代码:
  • public class MyBReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("receiver",intent.getStringExtra("data"));
        }
    }
  • manifest代码:
  • <receiver
                android:name = ".MyBReceiver"
                android:enabled="true"
                android:exported="true">      
     </receiver>

     

  • 发送广播:
  • Intent intent = new Intent(this,MyBReceiver.class);//无过滤器。
    intent.putExtra("data", "我爱你");
    sendBroadcast(intent);

2、动态注册和注销 BroadcastReceiver(通过action)

  • MyBReceiver 代码:
  • public class MyBReceiver extends BroadcastReceiver {
    
        static final public String ACTIION = "com.example.learnbroadcastreceiver.content.action.MyBReceiver"; 
        
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("receiver",intent.getStringExtra("data"));
        }
    }

     

  • manifes不要申明了ACTION的值随便都行,但是一般要符合大家同意的命名规则。因为registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION))就会注册一个相应带着action的receiver。

  • 发送广播:
  • Intent intent = new Intent(MyBReceiver.ACTIION);//action名称一样都是(MyBReceiver.ACTIION)的接收器都能收到。
    intent.putExtra("data", "我爱你"); 
    sendBroadcast(intent);

     

  • 注册reciever:
  • if (receiver==null) {
        receiver = new MyBReceiver();
        registerReceiver(receiver, new IntentFilter(MyBReceiver.ACTIION));
    }

     

  • 注销reciever:
  • if (receiver!=null) {
        unregisterReceiver(receiver);
        receiver = null;
    }

     

3、BroadcastReceiver 的优先级

  • action名称一样的接收都能够有权力接收到广播。但是其中优先级高的会先接收到广播。如果发送的广播属于有序广播(),那么优先级高的接收器可以利用abortBroadcast()防止广播继续向同类接收器传播。
  • 发送广播代码:
  • Intent intent = new Intent(MyBReceiver.ACTIION);
    intent.putExtra("data", "我爱你");
    sendOrderedBroadcast(intent, null);
  • manifest文件:
  • <receiver
                android:name = ".MyBReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter 
                    android:priority="100">
                    <action android:name = "ssss"></action>
               </intent-filter>
     </receiver>
            <receiver
                android:name = ".MyBReceiver1"
                android:enabled="true"
                android:exported="true">
                <intent-filter 
                    android:priority="99">
                    <action android:name = "ssss"></action>
                </intent-filter>
     </receiver>

     

  • 两个接收器代码:
  • 结果:
  • 未调用abortBroadcast
  • -----------------------------------------------------------------------------------------------------------------------------
  • 调用了abortBroadcast
posted @ 2015-05-15 11:44  何人之名  阅读(1309)  评论(0)    收藏  举报