Android 广播的应用和分类

一、普通广播:

1.普通广播是一种完全异步的广播,通过context的sendBroadcast方式进行发送,消息发送的速度很快,但是消息是无序的。
在没有一个匹配的广播接收者接到之前,没办法停止intent的传递。
2.使用方式:继承BrocastReceiver

public class BootReceiver extends BroadcastReceiver {  
  private final static String TAG = "BootReceiver";   
 @Override 
   public void onReceive(Context context, Intent intent) {      
      L.d(TAG, intent.getAction());     
      if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {      
        context.startService(new Intent(context, SocketService.class));    
        context.startService(new Intent(context, VideoService.class));  
      }   
 }
}

注册广播:有两种方式 静态注册----在清单文件中注册:

<receiver android:name="com.efrobot.control.receivers.BootReceiver">    
 <intent-filter>       
 <!-- 系统启动广播 -->       
 <action android:name="android.intent.action.BOOT_COMPLETED"/>   
 </intent-filter>
</receiver>

在代码块进行注册:

private void registerBrocastReceiver(){   
  IntentFilter filter = new IntentFilter();  
  filter.addAction(NOTIFY_VIDEO_CONTROL_FRAGMENT);  
  getContext().registerReceiver(mControlBrocast, filter);
}

记得在onDestory中进行解绑

监听系统网络状态的广播

 /**
     * 网络变化
     */
 private final static String CONNECTIVITY_ACTION =ConnectivityManager.CONNECTIVITY_ACTION;
  //注册广播监听
 IntentFilter mFilter = new IntentFilter();
 mFilter.addAction(CONNECTIVITY_ACTION);
 getContext().registerReceiver(myBroadcastReceiver, mFilter);


 private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            L.d(TAG, intent.getAction());
            String intentAction = intent.getAction();
            if (intentAction.equals(CONNECTIVITY_ACTION)) {
                if(!NetUtils.hasNetwork(getContext())){
                    onDisconnect(-1000, null);
                    L.e(TAG,"no Net,onDisconnect(-1000, null);");
                }
            }
        }
    };

二、有序广播:

有序广播通过sendOrderedBroadcast来发送,广播接收器接收的消息按照优先级依次执行。针对广播接收者监听的每一个行为的优先级可以在清单文件注册广播时,同时添加监听行为的优先级--->intent-filter中的android:priority属性进行设置。数值越大优先级越高。
例:对test行为处理的优先级是100。

<receiver android:name="com.efrobot.control.receivers.BootReceiver">    
 <intent-filter>       
 <!-- 系统启动广播 -->       
 <action android:name="android.intent.action.BOOT_COMPLETED"/>   
 </intent-filter>
 <intent-filter android:priority="100">       //数值越大优先级越高
 <!-- 系统启动广播 -->       
 <action android:name="com.orange.test"/>   
 </intent-filter>
</receiver>

在广播接收者接收到广播后,可以使用setResult()方法把处理的结果发送给下一个广播,下一个广播通过getResult()拿到上一个广播发送的结果。并可以使用abortBroadcast函数来让系统丢弃该广播,使当前行为的广播不在传递。

例子来源于:http://blog.csdn.net/superjunjin/article/details/7487187
注册两个广播2,接收到广播处理后,把结果传递给广播1

<application  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name" >  
        <activity  
            android:label="@string/app_name"  
            android:name=".C48_BroadcastActivity" >  
            <intent-filter >  
                <action android:name="android.intent.action.MAIN" />  
  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
            <!--优先级的设定 MyReceiver2大于MyReceiver1,优先级的范围-1000~1000 -->  
        </activity>  
        <receiver android:name=".MyReceiver1">  
            <intent-filter android:priority="200">  
                <action android:name="com.song.123"/>  
            </intent-filter>  
        </receiver>  
        <receiver android:name=".MyReceiver2">  
            <intent-filter android:priority="1000">  
                <action android:name="com.song.123"/>  
            </intent-filter>  
        </receiver>  
    </application>  
public class BroadcastActivity extends Activity {  
    /** Called when the activity is first created. */  
    Button button;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        button=(Button)findViewById(R.id.button);  
        button.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                Intent intent=new Intent("com.song.123");  
                Bundle bundle=new Bundle();  
                bundle.putString("a", "aaa");  
                intent.putExtras(bundle);  
                //发送一个有序的广播
                sendOrderedBroadcast(intent, null);  
            }  
        });  
    }  
}  

广播2因为优先级大 先接收这个广播

public class MyReceiver2 extends BroadcastReceiver{  
  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        // TODO Auto-generated method stub  
if(intent.getAction.equals("com.song.123")){
        System.out.println("receiver2");  
//      context.getSystemService(name);  
        Bundle bundle=intent.getExtras();  
        bundle.putString("b", "bbb");  
        System.out.println("a="+bundle.get("a"));  
        setResultExtras(bundle);  
        //切断广播  
//      abortBroadcast();  //切断后,处理的结果将不会传递给下一个广播--->广播1
}
   }  
  
}  

广播1如果不添加getResultExtras(true)方法,将不接收广播2处理的结果。

public class MyReceiver1 extends BroadcastReceiver{  
  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        // TODO Auto-generated method stub  
        System.out.println("receiver1");  
        //要不要接受上一个广播接收器receiver2传来的的数据  
        Bundle bundle=getResultExtras(true);  
        System.out.println("a="+bundle.getString("a")+",b="+bundle.getString("b"));  
    }    
}  

三、本地广播

本地广播实在21的版本的Support v4新增加的本地广播:LocalBroadcastManager。上述的两个都是全局的,所有应用都可以接收到,这样会造成安全隐患,有时候我们不需要把广播发送给所有的应用,所以本地广播提供了这个支持。使用的方式也很简单。把普通广播的发送方式改为:LocalBroadcastManager.getInstance(context)中对应的发送,解绑,注册方法就行了。

    .......
    private Context mContext;
    private IntentFilter mIntentFilter;
    private LocalBroadcastManager mLocalBroadcastManager;
    private LocalBroadcastReceiver mLocalBroadcastReceiver;

    .......
     /**
     * 注册本地广播接收者
     */
    private void registerLocalBroadcastReceiver(){
        mIntentFilter=new IntentFilter(test_action);
        mLocalBroadcastReceiver=new LocalBroadcastReceiver();
        mLocalBroadcastManager=LocalBroadcastManager.getInstance(mContext);
        mLocalBroadcastManager.registerReceiver(mLocalBroadcastReceiver, mIntentFilter);
    }
     
    /**
     * 发送本地广播
     */
    private void sendLocalBroadcast(){
        mIntent=new Intent(test_action);
        mIntent.putExtra(number, 9527);
        mLocalBroadcastManager.sendBroadcast(mIntent);
        //发送广播后取消本地广播的注册
        unRegisterLocalBroadcastReceiver();
    }
     
    /**
     * 取消本地广播的注册
     */
    private void unRegisterLocalBroadcastReceiver(){
        if (mLocalBroadcastManager!=null) {
            if (mLocalBroadcastReceiver!=null) {
                mLocalBroadcastManager.unregisterReceiver(mLocalBroadcastReceiver);
            }
        }
    }

四、Sticky广播。

1.Sticky广播是会滞留的广播,通过context.sendStickyBroadcast()方法进行发送,用此方法发送的广播会滞留一段时间,知道有对应的广播接收者注册时,该广播接收者就会收到该广播。
2.需要用到
android.permission.BROADCAST_STICKY 权限

sendStickyBroadcast只会保留最后一条广播,并且一直保存下去,这样即使有了广播接收者接收到了广播,当再有广播接收者被注册时仍然会接收到该广播。如果只想处理一遍该广播可以使用removeStickyBroadcast来处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容