四大组件之BroadcastReceiver

转载请注明出处 http://blog.csdn.net/f123210f/article/details/79364365

广播

说到广播,我们大家一定不陌生。生活中打开收音机,调频,收听即可。那么 Android 中的广播又是什么呢?

没错,它也是通信用的。比如手机来电话了,你的音乐就自己暂停播放了。有没有想过这是为什么,它是怎么知道你来电话了呢?

作用

广播的作用主要是用来通信的,最广泛的应用就是进程间的通信。

使用

广播如何发送和接收呢?
发送广播:

Intent intent = new Intent();
intent.setAction("cn.xb.test");
intent.setData(Uri.parse("test://data"));  
sendBroadcast(intent);    

接收广播:

public class MyReceiver extends BroadcastReceiver {  
    @Override
    public void onReceive(Context context, Intent intent) { 
        String str = intent.getAction();   
        Uri data = intent.getData();     //获取发送端的data内容
        if("cn.xb.test".equals(str)) {  //与自定义行动比较
            System.out.println(data.toString());//打印data
        }
    }
}

当然了别忘了,需要在 AndroidManifest.xml 中进行注册

<receiver android:name="cn.xb.test.Receiver.MyReceiver">  //这是接收类的全类名
    <intent-filter >
        <action android:name="cn.xb.test"/>  //与发送端要相同
        <data android:scheme="test"/>
    </intent-filter>
</receiver>

以上就完成了一个广播的发送,是不是很简单呢。

广播的种类

无序广播:发出广播,只要注册了这个广播的接收者都可以接受到这个广播,接收者没有先后顺序
sendBroadcast() 方法发送无序广播,上边的示例代码就是无序广播。

有序广播:发出广播,接收者按照优先级从高到低,一级一级的接受广播。通过sendOrderedBroadcast(); 方法发送有序广播。

有序广播有以下特点
优先级:可以指定接受者的优先级 -1000 ~ 1000,不写默认就是0
修改:高优先级的接收者可以修改广播里的数据 ,通过 setResultData(“”); 方法
终止:高优先级的接收者可以拦截终止广播 通过 abortBroadcast(); 方法
指定:可以指定 最终的广播接收者(不论怎样修改,怎样终止,最终接受者都可以收到)


那么大家思考一下,系统短信是有序的还是无序的呢?

系统短信是有序广播,那么我们是不是可以拦截短信进行修改呢?

当然,以前是可以的。但随着 Android 系统的不断完善,这些细小的 bug 都被进行了修复。所以大家就不要动歪点子喽。

注册方式

到这里不知道大家有没有疑问,在 AndroidManifest.xml 中注册了之后,就一定会收到广播,如果我们只在程序运行的时候想要接收广播,程序关闭时,我们不需要了呢?

那么我们就可以将注册从 xml 转移到 java 代码中,也就是动态注册

动态注册的好处显而易见,Android 官方也看到了,因此一些频繁的广播,官方并不希望一些没有运行的程序收到。因此像屏幕锁屏/解锁、电池电量的广播,都必须动态注册才可以收到。

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(""); 
//一些耗电的广播,一般动态注册,如网络变化
MyReceiver myReceiver = new MyReceiver();
//动态注册
registerReceiver(myReceiver, intentFilter);

注销

//注销
unregisterReceiver(myReceiver);

总结

  1. 广播是通信用的。
  2. 广播分为有序广播和无序广播。有序广播有优先级且可以拦截、修改、指定最终接受者。
  3. 广播可以静态注册,也可动态注册。频繁的(如:锁屏等)。必须使用动态注册。

小提示

  1. 如果使用了动态注册,那么记得注销掉,不然会引起内存泄漏。
  2. 广播的生命周期很短,不要做一些耗时的操作(开启新线程也不行)。如果实在有耗时的操作,请开启服务。
  3. 当然了,如果不想让我们自己的广播被外部接收到,我们可以使用一下方法,获得 manager,然后使用这个 manager 进行发送和注册。
LocalBroadcastManager instance = LocalBroadcastManager.getInstance(this);

虽谨小慎微,但难免疏漏。如有错误,欢迎大家留言指正。

如果对你起到了一丢丢的帮助的话,记得点赞哦!!!


转载请注明出处 http://blog.csdn.net/f123210f/article/details/79364365

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值