首页 > 代码库 > Android广播BroadcastReceiver

Android广播BroadcastReceiver

1.Android中的广播主要分为两种形式

  1)标准广播

    是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎在同一时刻都能接收到广播,所以它们之间并无顺序,也因此效率更高但同时也意味

着无法被截断。

2)有序广播

   是一种同步执行的广播,在广播发出后,同一时间只有一个广播接收器接收到该条广播,该接收器执行玩内部逻辑后才会继续传递该广播。因此该种广播有

序,优先级高 的接收器先接收到广播,并可以截断后续的广播。

2.Android中广播的注册方式

  若要接受广播,需要对广播接收器对其感兴趣的广播进行注册。

 1)静态注册

    在AndroidManifest.xml中注册,程序未启动也可接收到广播,android:name指定一个广播接收器,action标签指定要接收的广播。广播的优先级可以在

intent-filter字段的属性中设置

1 <receiver android:name=".MySmsBroadcastReceiver">
2     <intent-filter android:priority="100">
3         <action android:name="android.intent.action.BOOT_COMPLETED"/>
4     </intent-filter>
5 </receiver>    

2)动态注册

在代码中注册,动态注册的广播接收器一定必须都要取消注册的,能共动态注册和注销广播接收器,控制灵活,但是其必须在程序启动之后才能够启动。同样广

播的优先级可以在代码中设置。

 1 public class TestActivity extends Activity{
 2     private MySmsBroadcastReceiver mBroadscatReceiver;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState){
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_test);
 7         //动态注册广播
 8         mBroadscatReceiver=new MySmsBroadcastReceiver(this,new Handler());
 9         IntentFilter filter=newIntentFilter();
10         filter.setPriority(100);
11         filter.addAction("android.provider.Telephony.SMS_RECEIVED");
12         registerReceiver(mBroadscatReceiver,filter);
13     }
14     @Override
15     protected void onDestroy(){
16         super.onDestroy();
17         //取消注册,动态注册一定不要忘记取消注册
18         unregisterReceiver(mBroadscatReceiver);
19     }
20 }        

3.发送自定义广播

  1)发送标准广播

Intent intent=new Intent("com.example.mybroadcast");
sendBroadcast(intent);

  2)发送有序广播

Intent intent=new Intent("com.example.mybroadcast");
sendOrderedBroadcast(intent,null);

    第二个参数是与权限相关的字符串。对于接收到的广播,如果不想继续传递下去,可以在广播接收器中执行abortBroadcast()方法停止广播的继续传递。

4.本地广播。

  1)本地广播注册

前面所述发出的广播都是全局广播,即在同一设备上的所有应用程序都可以收到这种广播。要想发出的广播只能被本应用程序收到,就要靠本地广播了。本地广

播注册与普通广播注册唯一不同的是需要本地广播管理器进行中注册。

1 //动态注册广播
2 mBroadscatReceiver=new MySmsBroadcastReceiver();
3 mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);//获取实例
4 IntentFilter filter=new IntentFilter();
5 filter.setPriority(100);
6 filter.addAction("android.provider.Telephony.SMS_RECEIVED");
7 mLocalBroadcastManager.registerReceiver(mBroadscatReceiver,filter);//本地注册

  2)本地广播取消。

mLocalBroadcastManager.unregisterReceiver(mBroadscatReceiver);//本地取消注册

  3)本地广播的优点。

    a)数据不会泄露,不用担心存在安全隐患;

    b)发送本地广播比发送全局广播高效。

注: 本地广播不能在AndroidManifest.xml文件中静态注册。不要在广播接收器的onReceive()方法 中加入过多的代码逻辑和任何耗时操作,广播当中不允

许开启线程。广播更多的是扮演一种打开其他组件的角色,比如创建一个状态栏通知,开启一个服务等。

Android广播BroadcastReceiver