Android四大组件之BroadcastReceiver必备知识点

Android 广播分为两个角色:广播发送者、广播接收者

Android中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型

1.静态注册

1>注册方式:在AndroidManifest.xml里通过标签声明

<receiver
  //此广播接收者类是mBroadcastReceiver
    android:name=".MyBroadcastReceiver">
  //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.intent.action.MY_BROADCAST"/>
        <category android:name="android.intent.category.DEFAULT" />  
    </intent-filter>
</receiver>

2>在Activity中调用:

Intent intent = new Intent();  
intent.setAction("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");  
sendBroadcast(intent);  

2.动态注册

动态注册的程序只有在程序运行时才会收到广播消息,程序不运行了,它就收不到了。

MyReceiver receiver = new MyReceiver();  
IntentFilter filter = new IntentFilter();  
filter.addAction("android.intent.action.MY_BROADCAST");  
registerReceiver(receiver, filter);  

注销:unregisterReceiver(receiver);

补充:BroadcastReceiver的生命周期

BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。

有序广播:sendOrderedBroadcast(intent, null);

<receiver android:name=".MyReceiver">  
        <intent-filter android:priority="8">  
            <action android:name="android.intent.action.MY_BROADCAST"/>  
            <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>  
</receiver>  

在Intent-filter中添加一个android:priority=”8”属性,这个就是接收器优先级,数字越大的接收器,优先级越高,越先接到广播。

在一个接收器收到发来的Intent后,可以对其进行更改,对发送来的广播Intent进行修改是利用setResultExtras(bundle);

public class FirstRecever extends BroadcastReceiver {  

    private static final String TAG = "MyReceiver";    
    @Override  
    public void onReceive(Context context, Intent intent) {  
        // TODO Auto-generated method stub  

        //先获得传过来的MSG  
        String msg = intent.getStringExtra("msg");    
        Log.i(TAG, "FirstRecever:"+msg);  

        //接收通过setResultExtras传过来的msg  
        String msg = getResultExtras(true).getString("msg");    
        Log.i(TAG, "SecondReceiver: " + msg);   

        //更改广播数据  
        Bundle bundle = new Bundle();    
        bundle.putString("msg", msg + "@FirstReceiver");    
        setResultExtras(bundle);    
    }  
} 

通过setResultExtras(bundle); 传递的数据是不会更改原生广播的数据的。也只是原来广播数据中额外添加的数据

可以使用abortBroadcast(); //终止消息再传递

全部评论

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
牛客263158796号:我领羊一面后十天不挂也不推进 今天问hr说等前序的第一批意向发完看情况再看是否推进
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务