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);

更多相关文章

  1. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContex
  2. Android 线程优先级设置方法
  3. android中广播接收者BroadcastReceiver
  4. android 监听去电实现ip拨号 广播接收者
  5. Android 7.1 根据4G共享动态调整以太网优先级
  6. Android的进程优先级与进程回收详解
  7. 利用oom_adj提高Application所在进程的优先级

随机推荐

  1. Android之项目的目录结构
  2. button,imagebutton背景设置透明或者半透
  3. Android应用:AudioManager 播放音乐
  4. android 开发可能常用的一些网站
  5. Android获取手机屏幕宽高、状态栏高度以
  6. Android(安卓)RSA公钥加密
  7. android中json解析的两个工具:Gson和Jacks
  8. android无线内网打印机打印出图片
  9. android uri的用法
  10. 推荐4款开源的Android引导页控件