关闭

Android广播机制Broadcast详解

标签: android
379人阅读 评论(0) 收藏 举报
分类:

一、先介绍基本使用方法

第一步:我们要继承BroadcastReceiver类,实现自己的BroadcastReceiver。
private class DataRefreshRecieve extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.yiyo.stb".equals(intent.getAction())){
            stbDataRefresh();
            dissDialog();
        }
    }
}

第二步:.注册receiver

在 AndroidManifest.xml 中注册

< receiver android:name = ".MyBroadcastReceiver" >      
     < intent-filter android:priority = "1000" >  
           < action android:name = "com.yiyo.stb" />           
       </ intent-filter >     
  </ receiver > 

代码中注册

IntentFilter intentFilter = new IntentFilter( "com.yiyo.stb" );
registerReceiver( mBatteryInfoReceiver , intentFilter); 

第三步:发送广播

Intent intent=new Intent();
intent.setAction("com.yiyo.stb");
sendBroadcast(intent);

第四步:

实现onReceive方法(在方法里做相应操作)

private class DataRefreshRecieve extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("com.yiyo.stb".equals(intent.getAction())){
            stbDataRefresh();
            dissDialog();
        }
    }
}

二、Broadcast简介

在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。   


生命周期:



三、注意事项

1、生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在 BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框 


2、这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的 所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 .


3、如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 


四、广播的类型  

1、普通广播 (Normal broadcasts):发送一个广播,所以监听该广播的广播接收者都可以监听到该广播。  

2、有序广播 (Ordered broadcasts):按照接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,-1000 到 1000 之间 , 值越大 , 优先级越高 . 可以终止广播意图的继续传播 . 接收者可以篡改内容 . 


五、两种广播发送和接收

1、普通广播不再介绍

2、有序广播(Ordered Broadcast)发送和接收

  • sendOrderedBroadcast(intent, null);
    •  this.sendOrderedBroadcast(new Intent("android.provier.zhongnan.broadcast"), "xzq.zhongnan.test");

      代码中与上述例子最大的差别在于MainActivity中发送广播的代码: this.sendOrderedBroadcast(new Intent(

                    "android.provier.zhongnan.broadcast"), "xzq.zhongnan.test")增加了自定义的一个权限。

      AndroidManifest文件中配置自定义的权限:

          <permission android:protectionLevel="normal" android:name="xzq.zhongnan.test"></permission>

  • 中断广播,不再往下发放abortBroadcast();  

3、粘性sendStickyBroadcast

  • 它将发出的广播保存起来,一旦发现有人注册这条广播,则立即能接收到
    • 发这个广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY" />

      去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml 同样要加上面的权限; mContext.sendStickyBroadcast(intent);      

六、中断广播(有序广播中可操作)

  • abortBroadcast()可中断广播,后面就不会收到广播,sendOrderedBroadcast()中若第三个参数赋值ResultReceiver,      还是会收到广播,始终都是最后一个接收到


七、广播权限

  • a、发送端要求接收端的权限(要求接收者必须有权限)
        接收端必须持有发送端的权限才可以接收这个广播
        <permission/>声明权限---在发送端声明这个权限
        <uses-permission/>使用权限---在接收端使用这个权限才可以收到广播
    b、接收端要求发送端的权限
        在<receiver/>标签中指定android:permission=""权限,发送端必须有这个权限,接收端才会接收它的广播;若无权限,接收端不接收广播


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:93858次
    • 积分:2126
    • 等级:
    • 排名:第17890名
    • 原创:125篇
    • 转载:15篇
    • 译文:0篇
    • 评论:21条
    文章分类
    最新评论