广播接收者(BroadcastReceiver)

实现广播接收者:

    (1)继承BroadcastReceiver类,并重写onReceiver方法;

     例子:

         public class IncomingSMSReceiver extends BroadcastReceiver {
             @Override

             public void onReceive(Context context, Intent intent) {    }
         }

    (2)订阅接收感兴趣的意图(设置意图过滤器):

        1、使用代码进行订阅;

        例子:

            IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
            IncomingSMSReceiver receiver = new IncomingSMSReceiver();
            registerReceiver(receiver, filter);

        2、在AndroidMainfest.xml里面配置。

        例子:

            <receiver android:name=".IncomingSMSReceiver">
                <intent-filter>
                     <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                </intent-filter>
            </receiver>

 

广播类别:

    普通广播(Context.sendBroadcast()):

        普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

    有序广播(Context.sendOrderedBroadcast()):

        照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。有序广播的接收者可以终止(BroadcastReceiver.abortBroadcast())广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。另外,有序广播的接收者可以将数据传递(setResultExtras(Bundle)给下一个接收者(Bundle bundle = getResultExtras(true))。

 

广播接收者的响应:

    当BroadcastReceiver的onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。

    如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短(在onReceive() 执行后BroadcastReceiver 的实例就会被销毁),子线程可能还没有结束BroadcastReceiver就先结束了,所以采用子线程来解决是不可靠的。

 

其他广播:

    除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
    接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
    <receiver android:name=".IncomingSMSReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BATTERY_CHANGED"/>
        </intent-filter>
    </receiver>

     接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
    <receiver android:name=".IncomingSMSReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
    并且要进行权限声明:
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值