android 广播简介

原创 2015年07月08日 23:00:39

无序广播

特点:执行效率较高,发出去后能被不同应用 不同的广播接受者接受,不安全。

广播发送方式:

sendBroadcast(mIntent);//无序
广播接受者按生命周期分为动态注册的广播和静态注册的广播。

动态广播接受者注册:

动态注册的广播随着注册时的Context对象的销毁而销毁。也可以主动注销掉动态注册的广播接受者。

1.创建过滤器

IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
2.创建广播接受者

BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (LOCAL_ACTION.equals(intent.getAction())) {
            
            }
        }
    };
3.注册动态广播

 registerReceiver(mReceiver, filter);
4.注销广播

 @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }


静态广播

只要设备开启,广播接受者就是打开的,不用担心广播接受者被挂掉。
1.继承实现BroadcastReceiver

public class LocalBroadReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (LOCAL_ACTION.equals(intent.getAction())) {
        }
    }
}
2.在清单中注册广播

  <receiver android:name="com.example.androiddemo.LocalBroadReceiver" >
              <intent-filter >
                <action android:name="com.test.localbroad" />
            </intent-filter>
        </receiver>


有序广播

特点:执行效率较低,发出的广播按照优先级的高低,从高到底依次传递,可以在传递的过程中消耗掉该广播不让较低优先级的广播接受者接受到该广播。

有序广播跟无序广播使用上最大的不同是,要为注册的广播接受者设置一个优先级。其他部分流程类似。

广播发送方式:

sendOrderedBroadcast(mIntent, null);

设置优先级

1.动态注册的广播接受者

IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
        registerReceiver(mReceiver, filter);
        filter.setPriority(1000);//优先级
        registerReceiver(mReceiver, filter);
2.静态注册的广播接受者
  <receiver android:name="com.example.androiddemo.LocalBroadReceiver" >
              <intent-filter android:priority="500">
                <action android:name="com.test.localbroad" />
            </intent-filter>
        </receiver>


第一次接收到广播获取接收到的参数
使用 abortBroadcast();可以可以消耗掉该广播,不让广播继续向下传送。

Bundle bundle=intent.getExtras();
setResultExtras(bundle); 
接受上一层广播接受者分发的参数

//是否接受上一个广播接收器传来的的数据  
Bundle bundle=getResultExtras(true);  

在Android系统中,BroadcastReceiver的设计初衷就是从全局考虑的,可以方便应用程序和系统、应用程序之间、应用程序内的通信,所以对单个应用程序而言BroadcastReceiver是存在安全性问题的,相应问题及解决如下:
1、当应用程序发送某个广播时系统会将发送的Intent与系统中所有注册的BroadcastReceiver的IntentFilter进行匹配,若匹配成功则执行相应的onReceive函数。可以通过类似sendBroadcast(Intent, String)的接口在发送广播时指定接收者必须具备的permission。或通过Intent.setPackage设置广播仅对某个程序有效。
2.  当应用程序注册了某个广播时,即便设置了IntentFilter还是会接收到来自其他应用程序的广播进行匹配判断。对于动态注册的广播可以通过类似registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定发送者必须具备的permission,对于静态注册的广播可以通过android:exported="false"属性表示接收者对外部应用程序不可用,即不接受来自外部的广播。

其实通过LocalBroadcastManager可以很好的解决这些问题。

LocalBroadcastManager

特点:执行效率高,用来在同一个应用的不同组件间发送广播。
Android v4 兼容包提供android.support.v4.content.LocalBroadcastManager工具类,主要负责程序内部广播的注册与发送。也就是说,它只是适用代码中注册发送广播,对于在AndroidManifest中注册的广播接收,则不适用。使用它比直接通过sendBroadcast(Intent)发送系统全局广播有以下几点好处。
  • 1.因广播数据在本应用范围内传播,你不用担心隐私数据泄露的问题。
  • 2.不用担心别的应用伪造广播,造成安全隐患。
  • 3.相比在系统内发送全局广播,它更高效。
使用过程:
1.获取LocalBroadcastManager实例
LocalBroadcastManager mLocal;
        mLocal = LocalBroadcastManager.getInstance(this);
2.发送广播
mLocal.sendBroadcast(mIntent);
3.注册广播接受者
 IntentFilter filter = new IntentFilter();
        filter.addAction(LOCAL_ACTION);
        mLocal.registerReceiver(mReceiver, filter);
4.注销
mLocal.unregisterReceiver(mReceiver);


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android基础:广播接收器及其生命周期介绍

广播接收器(Broadcast Receivers)只是接收广播并对广播信息做出作出反应,多数的广播是由系统代码发出的——比如反应时区变化的通知,电量低的通知,照了一张照片的通知,或者用户修改了系统语...
  • cuigx1991
  • cuigx1991
  • 2015年08月10日 18:21
  • 1342

老罗:Android系统中的广播(Broadcast)机制简要介绍和学习计划

博客源址:Android系统中的广播(Broadcast)机制简要介绍和学习计划 博客时间:2011-08-31 01:12        在Android系统中,广播(Broadcast)是...
  • Buaaroid
  • Buaaroid
  • 2015年11月05日 16:01
  • 7197

android各种广播简介

android.app.action.ACTION_PASSWORD_CHANGED android.app.action.ACTION_PASSWORD_EXPIRING android...
  • u010136741
  • u010136741
  • 2015年10月12日 12:12
  • 585

android之BroadcastReceiver(广播接收者)

BroadcastReceiver本意是广播接收者。这个也是android四大组件之一,广播其实我们也不难理解它,打个简单的比方,比如我们上课时,只要听到下课的铃声,这说明就要下课。在安卓中,广播是全...
  • song_shui_lin
  • song_shui_lin
  • 2016年10月05日 23:14
  • 5357

【Android】Android中广播的基本使用

接受系统广播动态注册 在Java代码中指定IntentFilter,然后想监听什么广播就添加对应的Action。动态注册的广播,一定要调用unregisterReceiver()方法取消注册。 下...
  • White_Idiot
  • White_Idiot
  • 2017年02月04日 14:30
  • 697

说说Android的广播(4) - 前台广播为什么比后台广播快?

其实,这种前台广播的设计,就是为了加速广播的性能而设计的。二者在设计思想上就有不同。根据应用层实际的需求,决定使用前台广播还是后台广播,本来就是应用设计时候应该考虑的问题。...
  • lusing
  • lusing
  • 2016年06月08日 16:39
  • 3360

Android-动态注册广播和注销广播

Android-动态注册广播和注销广播静态注册广播广播机制在安卓开发很常见也很重要,它既可以静态注册,也可以 动态注册和注销,广播可以设置优先级。 首先是静态 activity_main.xml...
  • ACM_TH
  • ACM_TH
  • 2016年01月13日 12:23
  • 7231

android 解决广播接收延时问题:前台广播

android 解决广播接收延时问题:前台广播 。   Intent mIntent = new Intent("android.i...
  • mzm2438975656
  • mzm2438975656
  • 2015年12月07日 11:40
  • 6965

android注册广播的两种方式与区别

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:...
  • zhiwenyan
  • zhiwenyan
  • 2016年02月24日 12:21
  • 16283

Android 广播监听网络状态

我们在做多线程下载的时候,或者是在加载h5界面的时候,常常会遇到网络状态不好或者断网的时候,在这或者当我们的应用程序启动没有退出的时候,我们就需要对网络状态监听加以判断。 这时候,我们一般情况下,两种...
  • androidstarjack
  • androidstarjack
  • 2016年01月13日 10:49
  • 2051
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 广播简介
举报原因:
原因补充:

(最多只允许输入30个字)