Android——Broadcast Receiver(广播接收者)
Android四大组件分别为Activity(活动)、Service(服务)、Broadcast Receiver(广播接收者)、Content Provider(内容提供者)
Broadcast Receiver(广播接收者)
广播是android中在应用程序间传递消息的机制,而要过滤并取得广播中的消息就需要用到Broadcast Receiver,可以监听广播消息并实现不同组件的通信。
如果手写一个类继承BroadcastReceiver的话,同样需要在清单文件中注册
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"></receiver>
上述为静态注册,广播接收者还可以动态注册,即在Activity中直接注册,但是当Activity销毁时,该广播接收者也销毁。
BroadcastReceiver的生命周期较短,因此不宜做一些耗时的操作,应该将耗时操作交给Service去完成。
广播的类型
无序广播、有序广播、本地广播、粘性广播
1.无序广播
无序广播是异步执行的,发送广播时,所有能接收的广播接收者都能接收到信息,顺序不定,但效率较高且无法被拦截。
//发送方法一MyReceiver myReceiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_ON);//设置点亮屏幕是事件监听registerReceiver(myReceiver, filter);//关闭广播unregisterReceiver(myReceiver);//发送方法二 Intent intent = new Intent(Intent.ACTION_SCREEN_ON);sendBroadcast(intent);
在MyReceiver中可设置对应操作:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "点亮了屏幕", Toast.LENGTH_SHORT).show(); }}
2.有序广播
有序广播是同步执行的,接收者按照申明的优先级来确定依次接收的顺序,当一个广播接收者接收到信息并且处理完之后,该广播才会继续传播给其他优先级低的接收者,顺序确定,但效率较低并且可被拦截。
广播优先级的设置 在清单文件中注册广播接收者时,在
标签中设置priority的值:
值为整数,值越大优先级越高,如果两个广播接收者的优先级相同,则看哪个广播接收者先注册,不同程序监听同个广播的话,若优先级相同,则看哪个程序先安装。
Intent intent = new Intent(Intent.ACTION_SCREEN_ON);sendOrderedBroadcast(intent,null);//第二个参数为接收者需要的权限
还可以如下发送有序广播,可用于指定某个广播接收者必定收到广播:
sendOrderedBroadcast(Intent intent,String receiverPermission,//接收者需要的权限BroadcastReceiver resultReceiver,//该广播接收者是最终一定会执行的,即使广播被拦截或者终止。Handler scheduler,int initialCode,String initialData,Bundle initialExtras);
在广播接收者中拦截广播:
abortBroadcast();//拦截广播
在广播接收者中还可以修改广播中的数据:
//获得数据int code = getResultCode();String data = getResultData();Bundle bundle = getResultExtras(true);//修改数据setResultCode(666);setResultData("666");Bundle bundle = new Bundle();bundle.putString("666", "666");setResultExtras(bundle);
3.本地广播
上述广播是可以被全部对应的广播接收者接收,因此会被其他应用接收,可能会产生一些不安全的操作。本地广播机制发出广播后只能被该应用程序内部进行传播,广播接收者只能接收本应用程序内部的广播。
本地广播只能在代码中注册,且不能拦截
Intent intent = new Intent(Intent.ACTION_SCREEN_ON);LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent);
4.粘性广播
粘性广播发送后如果没有接收者接受处理,则会一直存在系统中等待处理。
粘性广播因为缺乏安全性,其他广播接收者可以随意访问和修改,会导致一些难以估计的问题,因此官方已经舍弃了。
sendStickyBroadcast(Intent intent);
更多相关文章
- 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContex
- Android 线程优先级设置方法
- android中广播接收者BroadcastReceiver
- android 监听去电实现ip拨号 广播接收者
- Android 7.1 根据4G共享动态调整以太网优先级
- Android的进程优先级与进程回收详解
- 利用oom_adj提高Application所在进程的优先级