您的位置:首页 > 移动开发 > Android开发

Android广播机制Broadcast详解

2015-11-20 11:37 337 查看

一、先介绍基本使用方法

第一步:我们要继承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=""权限,发送端必须有这个权限,接收端才会接收它的广播;若无权限,接收端不接收广播
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: