Android——组件值BroadcastReceiver

一、Broadcast(广播)

     是一种广泛运用在应用程序之间传输信息的机制。

二、BroadcastReceiver(广播接收者)

     是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。

    用途:

    1. 当开机完成后系统会产生一条广播;一些开机启动的app就会接收到该广播,并自启。

    2. 当网络状态改变时系统会产生一条广播;

    3. 当手机电量改变时,系统会产生一条广播

    4.  。。。。。。

三、Android为什么要这样设计?

    如果没有广播,app需要自己获取对应的信息并进行处理,比较麻烦。有了广播之后,只需等待广播然后去处理。

   1. 大大减少开发的工作量和开发周期。

   2. 作为应用开发者,只需掌握BroadcastReceiver

四、使用发送

   发送: (1)把信息装入一个Intent对象(如Action、Category)

               (2)通过调用相应的方法将Intent对象以广播方式发送出去

                   - sendBroadcast()

                   - sendOrderBroadcast()

                   - sendStickyBroadcast()

    接收:当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

   BroadcastReceiver需要注册

   -静态注册

   -代码注册

注意!!

(1)BroadcastReceiver生命周期只有十秒左右,很短

(2)在BroadcastReceiver里不能做一些比较耗时的操作,如果比较耗时,可以发送给Service,由Service来完成。

(3)不能使用子线程,broadcastReceiver生命周期结束后,线程也可能被杀死。


五、广播的种类

1.普通广播(Normal broadcasts)

    所有监听该广播的广播接收者都可以监听到该广播

    (1)同级别接收先后是随机的(无序),是同时收到的

    (2)级别低的后收到广播

    (3)接收器不能截断广播的继续传播也不能处理广播

    (4)同级别动态注册高于静态注册

//发送普通广播
Intent intent = new Intent();
intent.putExtra("msg","这是一条普通广播");
intent.setAction("cc.xxx.yy.ccc");//为了让接收器知道接收的是哪条广播,设置Action 或 Category,必须是唯一的,可以写成包名.类名
sendBroadcast(intent);
新建类继承抽象类BroadcastReceiver重写onReceive(Context context,Intent intent)方法

public void onReceive(Context context,Intent intent){
   String str= intent.getStringExtra("msg");
}//在Manifest.xml的application标签内添加


   
 
  
//动态注册接收器,生命周期依赖于程序的生命周期
//在activity中的onCreate()方法中
public void onCreate(savedInstanceState){
  IntentFilter intentFilter = new IntentFilter("action的名字如cc.xxx.yy.ccc");
  BC bc = new BC(); //BC为BroadcastReciver的派生类
  registerReceiver(bc,intentFilter);
}


2.有序广播(Ordered broadcasts)

    按照接收者的优先级顺序接收广播,优先级别再intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。

    (1)同级别接收顺序是随机的。

    (2)能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定把该广播是否截断。l拦截广播:onReceive()中调用abortBroadcast()

    (3)接收器能截断广播的继续传播,也能处理广播——处理:setResultExtras(bundle)、得到处理后的值Bundle Bundle= getResultExtras(true)

    (4)同级别动态注册高于静态注册。

Intent intent = new Intent();
intent.putExtra("msg","这是一条有序广播");
intent.setAction("cc.xxx.yy.ccc");//为了让接收器知道接收的是哪条广播,设置Action 或 Category,必须是唯一的,可以写成包名.类名
sendOrderedBroadcast(intent,权限这里写为null);

3.异步广播(粘滞性滞留广播):需加权限BROADCAST_STICKY

     不能将处理结果传给下一个接收者,无法终止广播。——与1、2不同,它可以先发广播、再注册接收器,同样能收到广播

  

sentStickyBroadcast(intent);
IntentFilter intentFilter = new IntentFilter("action的名字如cc.xxx.yy.ccc");
BC bc = new BC(); //BC为BroadcastReciver的派生类
registerReceiver(bc,intentFilter);
 
  注意:如果是动态注册的Receiver,需要在最后销毁动态注册的接收器 unregisterReceiver(派生类BC); 
  

你可能感兴趣的:(Android)