【Android】之【BroadcastReceiver】

从不同的纬度区分,BroadcastReceiver可以分为不同的类别

①系统广播/非系统广播

②全局广播/本地广播

本地广播
1.发送的广播只能在本程序内传递,不必担心数据泄露
2.其它程序广播无法发送到本程序的内部,不必担心安全漏洞隐患
3.本地广播比系统全局广播更加高效
4.本地广播只能被动态注册,不能静态注册,动态注册或方法时需要用到LocalBroadcastManager

③无序广播/有序广播/粘性广播

有序广播 https://www.cnblogs.com/lcy0515/p/10807870.html
是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断或者修改正在传递的广播,这样后面的广播无法接受到广播消息或者接收到不真实的广播消息。这种广播是全局性的,其他的应用程序都可以接受到。

sendOrderedBroadcast 来发送 android:priority 来区分先后顺序

<receiver android:name=".ProvinceReceiver">
    <intent-filter android:priority="1000">
        <action android:name="myfadami" />
    </intent-filter>
</receiver>
<receiver android:name=".CityReceiver">
    <intent-filter android:priority="500">
        <action android:name="myfadami" />
    </intent-filter>
</receiver>

粘性广播 https://my.oschina.net/ososchina/blog/347765
粘性广播在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。
系统粘性广播一般用来确保重要的状态改变后的信息被持久保存,并且能随时广播给新的广播接收器,比如电源的改变,因为耗电需要一个过程,前一个过程必须提前得到,否则可能遇到下次刚好接收到的广播后系统自动关机了,随之而来的是kill行为,所以对某些未处理完的任务来说,后果很严重。

广播的实现

http://biandroid.iteye.com/blog/1608833

两种注册BroadcastReceiver的方法

①动态注册:在应用程序的代码中进行注册

注册BroadcastReceiver registerReceiver(receiver,filter)
取消注册BroadcastReceiver unregisterReceiver(receiver)

②静态注册:在AndroidManifest.xml当中进行注册

<receiver android:name="SMSReceiver">
      <intent-filter>
       <action android:name="android.provider.Telephony.SMS_RECEIVED" />
      </intent-filter>
</receiver>  

动态广播实现

①注册

  public void registerBoradcastReceiver(){  
        IntentFilter myIntentFilter = new IntentFilter();  
        myIntentFilter.addAction(ACTION_NAME);//增加监听的Action
        //注册广播        
        registerReceiver(mBroadcastReceiver, myIntentFilter);  
    }  

②接收

private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver(){  
          @Override  
          public void onReceive(Context context, Intent intent) {  
              String action = intent.getAction();  
              if(action.equals(ACTION_NAME)){  
                  Toast.makeText(Test.this, "处理action名字相对应的广播", 200);  
              }  
          }  
      };  

③触发

mBtn.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) {  
            Intent mIntent = new Intent(ACTION_NAME);  
            mIntent.putExtra("yaner", "发送广播,相当于在这里传送数据");  
          //发送广播  
            sendBroadcast(mIntent);  
        }  
    });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy程序猿2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值