BroadcastReceiver
2013-05-10 00:46
134 查看
Broadcast 广播,相当于系统的全局消息,可以跨进程发送。
BroadcastReceiver广播接收器,作为android系统的四大组件之一,用来接收广播消息并且处理。
实现广播的步骤
1.注册BroadcastReceiver
2.发送广播
一,注册BroadcastReceiver。有2种方法:
1.在AndroidManifest.xml中添加<receiver>标签,在代码中继承BroadcastReceiver
onReceive方法用于处理收到广播进行的操作。
AndroidManifest.xml:
2.通过代码动态注册广播
如果想在让广播生命周期和activity一致,可以在onResume()中注册,则onPause()中调用unregisterReceiver注销。
二,发送广播
广播有2种形式:普通广播和有序广播
普通广播是异步接收的,接受的广播不受发送顺序的限制。
发送普通广播:
有序广播同时向一个receiver发送广播,优先级最高的先处理广播,由其决定是继续传播还是终止广播
设置receiver优先级:在<receiver>标签中指定android:priority
如上设置后ToastReceiver2首先接受到有序广播,因为30>20(范围-1000到1000)
ToastReceiver2可以增加intent中bundle的内容:
ToastReceiver2处理完后,ToastReceiver收到广播,通过
Bundle b = getResultExtras(true);
得到ToastReceiver2传输的数据。
ToastReceiver2也可以终止有序广播,这样ToastReceiver收不到广播
abortBroadcast();
发送有序广播:
sendOrderedBroadcast(intent, null);
BroadcastReceiver生命周期:
一个进程的生命周期取决于它组件的生命周期。如果一个apk,不包含activity,service等组件,只有BroadcastReceiver用来接收广播,系统根据intent启动BroadcastReceiver后,BroadcastReceiver程序是一个独立进程,这个进程中也有自己的MainThread,MainThread处理onReceive回调方法。如果onReceive方法中操作超过10秒会产生ANR错误。如果在独立的BroadcastReceiver进程中需要执行异步操作(new一个子线程),可以通过启动service,在service中去做这个操作(可以用IntentService),因为在onReceive中启动一个线程后,BroadcastReceiver进程可能就结束了
,这时候很可能因为receiver结束的原因启动的线程没执行完已经被系统释放了。(如果这个apk中包含其他组件,并且BroadcastReceiver启动时有其他组件正在运行,则不用考虑这么复杂,直接在onReceive方法中new一个线程就行了)
安全性:如果想让广播和广播接收器仅仅在一个应用中起作用,使用LocalBroadcastManager类
LocalBroadcastManager的优点:
1.广播只在一个应用中传播
2.别的应用不能向此应用的broadcastreceiver发送广播
3.效率高于系统广播
用法:
BroadcastReceiver广播接收器,作为android系统的四大组件之一,用来接收广播消息并且处理。
实现广播的步骤
1.注册BroadcastReceiver
2.发送广播
一,注册BroadcastReceiver。有2种方法:
1.在AndroidManifest.xml中添加<receiver>标签,在代码中继承BroadcastReceiver
onReceive方法用于处理收到广播进行的操作。
AndroidManifest.xml:
<receiver android:name=".ToastReceiver" > <intent-filter> <action android:name="android.recevier.ToastReceiver" /> </intent-filter> </receiver>java:
public class ToastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "onReceive", Toast.LENGTH_LONG).show(); } }
2.通过代码动态注册广播
BroadcastReceiver receiver = new ToastReceiver(); IntentFilter filter = new IntentFilter("android.recevier.ToastReceiver"); registerReceiver(receiver, filter);
public class ToastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "onReceive", Toast.LENGTH_LONG).show(); } }
如果想在让广播生命周期和activity一致,可以在onResume()中注册,则onPause()中调用unregisterReceiver注销。
二,发送广播
广播有2种形式:普通广播和有序广播
普通广播是异步接收的,接受的广播不受发送顺序的限制。
发送普通广播:
Intent intent = new Intent("android.recevier.ToastReceiver"); sendBroadcast(intent);
有序广播同时向一个receiver发送广播,优先级最高的先处理广播,由其决定是继续传播还是终止广播
设置receiver优先级:在<receiver>标签中指定android:priority
<receiver android:name=".ToastReceiver" > <intent-filter android:priority="20" > <action android:name="android.recevier.ToastReceiver" </intent-filter> </receiver> <receiver android:name=".ToastReceiver2" > <intent-filter android:priority="30" > <action android:name="android.recevier.ToastReceiver2" </intent-filter> </receiver>
如上设置后ToastReceiver2首先接受到有序广播,因为30>20(范围-1000到1000)
ToastReceiver2可以增加intent中bundle的内容:
Bundle b = new Bundle(); b.putString("new", "new"); setResultExtras(b);
ToastReceiver2处理完后,ToastReceiver收到广播,通过
Bundle b = getResultExtras(true);
得到ToastReceiver2传输的数据。
ToastReceiver2也可以终止有序广播,这样ToastReceiver收不到广播
abortBroadcast();
发送有序广播:
sendOrderedBroadcast(intent, null);
BroadcastReceiver生命周期:
一个进程的生命周期取决于它组件的生命周期。如果一个apk,不包含activity,service等组件,只有BroadcastReceiver用来接收广播,系统根据intent启动BroadcastReceiver后,BroadcastReceiver程序是一个独立进程,这个进程中也有自己的MainThread,MainThread处理onReceive回调方法。如果onReceive方法中操作超过10秒会产生ANR错误。如果在独立的BroadcastReceiver进程中需要执行异步操作(new一个子线程),可以通过启动service,在service中去做这个操作(可以用IntentService),因为在onReceive中启动一个线程后,BroadcastReceiver进程可能就结束了
,这时候很可能因为receiver结束的原因启动的线程没执行完已经被系统释放了。(如果这个apk中包含其他组件,并且BroadcastReceiver启动时有其他组件正在运行,则不用考虑这么复杂,直接在onReceive方法中new一个线程就行了)
安全性:如果想让广播和广播接收器仅仅在一个应用中起作用,使用LocalBroadcastManager类
LocalBroadcastManager的优点:
1.广播只在一个应用中传播
2.别的应用不能向此应用的broadcastreceiver发送广播
3.效率高于系统广播
用法:
LocalBroadcastManager lm = LocalBroadcastManager.getInstance(getApplicationContext()); BroadcastReceiver receiver = new ToastReceiver(); IntentFilter filter = new IntentFilter("android.recevier.ToastReceiver"); lm.registerReceiver(receiver, filter); Intent intent = new Intent("android.recevier.ToastReceiver"); lm.sendBroadcast(intent);
相关文章推荐
- 39.Android BroadcastReceiver
- 利用广播机制(BroadcastReceiver)窃听短信
- 使用Service和BroadcastReceiver实时监听网络状态
- BroadCastReceiver(广播接收者的静态注册)简单使用例子
- Android 如何在service和BroadCastReceiver中 启动activity和alertdialog?
- android音乐播放器实现(Service+BroadcastReceiver+Notification)
- Android广播(BroadcastReceiver)
- BroadCastReceiver详解
- BroadcastReceiver源码解析(二)
- broadcastReceiver
- BroadcastReceiver 之有序广播
- BroadcastReceive——BroadcastReceiver的生命周期
- 在Service或者BroadCastReceiver中弹出dialog
- BroadcastReceiver使用方式
- 广播接收者BroadcastReceiver
- BroadcastReceiver 中dialog的使用
- BroadcastReceiver详解(二)
- Android中广播接收者BroadcastReceiver使用
- BroadcastReceiver.PendingResul