BroadCastReceiver(广播)

1、启动方式:有序,无序

无序广播:是一种完全异步执行的广播,在广播发出之后,所有的
广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播:是一种同步执行的广播,在广播发出之后,同一时刻
只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2、发送广播
广播是使用 Intent 进行传递的,因此你还可以在 Intent 中携带一些数据传递给广播接收器。

//利用隐式Intent指定action,
Intent intent=new Intent(String action);
//可以传递数据到广播
//继承BroadCastReceiver里的onReceive()方法携带一个Intent
//自然可以利用这个Intent对象获取数据
//intent.putExtra()
//发送广播,action相同就会接收到

(1)、 发送无序广播

sendBroadcast(intent);

(2)、发送有序序广播

//多个广播接收器时,在intent-filter 中添加优先级
<intent-filter android:priority="100" >
//第二个参数是一个与权限相关的字符串,这里传入 null 就行了
sendOrderedBroadcast(intent,null);

3、申明方式:常驻,暂驻

常驻:静态注册广播接收器:

//1、创建一个类继承BroadcastReceiver 
public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}

//2、在AndroidManifest.xml 中将这个广播接收器的类名注册进去
<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true" >
</receiver>

暂驻:动态注册广播接收器 :可以自由地控制注册与注销,在灵活性方面有很大的优势,但是
它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。

//1、在Activity定义一个类继承BroadCasrReceiver
class MyReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) 
     {               

     }
}
//2、使用动态intentFilter给这个类设置属性
MyReceiver myreceiver=new MyReceiver();
IntentFilter intentFilter=new IntentFilter();
//添加一个action
intentFilter.addAction();
//设置优先级别
intentFilter.setPriority(-1000~1000);
//调用 registerReceiver()方法进行注册
registerReceiver(myreceiver,intentFilter);

PS:动态注册的广播接收器一定都要取消注册才行
调用 unregisterReceiver(BroadcastReceiver receiver)方法取消注册

4、广播之间传递信息

//BroadCastReceiver类中有这么两个方法
//源码
public final void setResultExtras(Bundle extras) {
        checkSynchronousHint();
        mPendingResult.mResultExtras = extras;
}

public final Bundle getResultExtras(boolean makeMap) {
        if (mPendingResult == null) {
            return null;
        }
        Bundle e = mPendingResult.mResultExtras;
        if (!makeMap) return e;
        if (e == null) mPendingResult.mResultExtras = e = new Bundle();
        return e;
}
 --存入信息--
 //创建一个Bundle对象
 Bundle  bundle=new Bundle(); 
 //传入一个字符串数据
 bundle.putString("key","values")
 //将这个对象传入
 setResultExtras(bundle);

 --取出信息--
 getResultExtras(true).getString("key");

5、广播拦截
如果在 onReceive()方法中调用了 abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播

class MyReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) 
     {               
      //在这里获取action,判断你要拦截的action
      //intent.getAction();
      //拦截
      abortBroadcast()
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值