转载请注明出处 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);
总结
- 广播是通信用的。
- 广播分为有序广播和无序广播。有序广播有优先级且可以拦截、修改、指定最终接受者。
- 广播可以静态注册,也可动态注册。频繁的(如:锁屏等)。必须使用动态注册。
小提示
- 如果使用了动态注册,那么记得注销掉,不然会引起内存泄漏。
- 广播的生命周期很短,不要做一些耗时的操作(开启新线程也不行)。如果实在有耗时的操作,请开启服务。
- 当然了,如果不想让我们自己的广播被外部接收到,我们可以使用一下方法,获得 manager,然后使用这个 manager 进行发送和注册。
LocalBroadcastManager instance = LocalBroadcastManager.getInstance(this);
虽谨小慎微,但难免疏漏。如有错误,欢迎大家留言指正。
如果对你起到了一丢丢的帮助的话,记得点赞哦!!!
转载请注明出处 http://blog.csdn.net/f123210f/article/details/79364365