android中Broadcastreceiver学习

来源:互联网 发布:矩阵每一列的归一化 编辑:程序博客网 时间:2024/06/05 16:09
BroadcastReceiver是android中四大组件之一,称为是APP广播接收器。android中app之间通信有多种方式如:BroadcastReceiver,ContentResolver,SharedPreferences,IO.File,AIDL等,本人认为BroadcastReceiver是比较常用也是用的比较多的,android系统自带程序里事件触发时一般都会发送广播,开发自己的App时只要注册监听此广播,从而可以收到系统广播消息。所以它可以实现对整个android系统上的App广播监听。


通过开发文档可知,BroadcastReceiver分为两种,一种为普通广播(Normal broadcasts),另一种为顺序广播(Ordered broadcasts)。使用时需要新建的类型继承BroadcastReceiver,然后实现onReceive()方法。如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String act = intent.getAction();
if(act.equals("...")){
//...
}else {
//...
}
    }


}


当接收到消息时,onReceive()方法会被执行,所以若要对广播消息的处理要放到onReceive()方法里,通过String act = intent.getAction();可以获取接收到的action以区分是何种类型的消息,广播的onReceive()方法运行在主线程中,所以对此方法执行的时间通常限制为10s。


使用BroadcastReceiver前除了上述先继承外,还需要注册,注册广播有两种方式:一种是在AndroidManifest.xml文件中注册,使用<receiver ... />标签,android:name指定类型名,<action />标签就是该该广播类可以接收到的消息类型。此种方式无需取消注册,使用完了系统自行取消注册;


  <receiver android:name="com.example.testbroadreceiver.BroadCast1" 
            android:permission="com.example.myaction.permission"
            android:exported="true" 
            >
            <intent-filter>
                <action android:name="com.example.ACTION.ACT1" />
                <action android:name="com.example.ACTION.ACT2" />
            </intent-filter>
  </receiver>


另一种在代码里注册,通常在Activity.onResume()方法里注册,在Activity.onPause()里取消注册,当然也要看实际需求而定,也可放到Activity.onDestory()里面取消注册。
//...
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.ACTION.ACT1");
intentFilter.addAction("com.example.ACTION.ACT2");
registerReceiver(receiverObj, intentFilter);
//...


广播只有注册完后才能接收到广播消息,非则接收不到,当然也跟注册时的配置项有关系。
发送普通广播使用Context.sendBroadcast(intent)方法,intent中需指定action,action为注册时指定的action字符串,未注册的action发送了是接收不到的。如果注册是指定了Permission,则发送广播时也需指定permission使用Context.sendBroadcast(intent,permission)方法,不过在本人电脑上测试时未能完成。

发送顺序广播使用Context.sendOrderedBroadcast(intent,permission)方法,若有多个广播匹配到action,则按先后顺序传递执行,注册时可以通过android:priority自行指定顺序,执行前一个onReceiver()方法中可以设置参数信息传递到下一个接收的onReceiver()中。如果想取消发送的广播可以使用abortBroadcast()方法,只要还未执行的广播就会不再执行它的onReceiver()方法了。



0 0