Forver.微笑

面带微笑未必真的开心,但笑起的那一刻,心中的那些不开心的事已经不重要了~

0%

BroadcastReceiver基础

Android四大组件之一。

实现一个广播的步骤

创建一个广播接收器类

继承自BroadcastReceiver,实现onReceive()方法,onReceive方法通过intent-filter过滤要处理的广播

1
2
3
4
5
6
7
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//这里注意,静态注册的context为ReceiverRestrictedContext,动态注册的广播为Activity的context,LocalBroadcastManager注册的广播为Application的context
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}

广播接收器可以接收系统广播和app自定义的广播。

注册广播接收器

有2中注册方式

静态注册

在AndroidManifest中注册。这种广播在应用安装时即被系统解析,这种形式的广播不需要应用启动就可以收到相应的广播(较高的版本已不支持)。

动态注册

在代码中通过context.registerReceiver()注册,不需要的时候通过context.unRegisterReceiver()接触广播。这种广播需要应用启动并注册后才能接收广播。

发送广播

context提供了

  • sendBroadcast()方法发送广播普通广播,光播发出去后,几乎所有接收者是同一时间收到广播。
  • sendOrderedBroadcast()发送有序广播,广播发出去后,同一时刻只有一个广播接收器可以收到消息。当广播中的逻辑执行完毕后,广播才会继续传播。

广播的安全性问题

Android中的广播可以跨进程通信。因此可能存在一些问题:

  • 其他APP可能会发出针对当前App的广播,导致当前APP不断的收到并处理广播。
  • 其他APP可以注册广播接收器,获取当前APP的广播信息

因此需要采取一些措施避免以上的问题发生

  • 将expored属性设置为false,使得当前APP发出的广播只能由当前APP接收。
  • 发送广播和接收广播时,设置permission,用于权限校验
  • 发送广播时,指定广播接收器所在的包名 (intent.setPackage(packageName))
  • 采用LocalBroadcastReceiver

LocalBroadcastManager

特点

  • 通过单例模式创建对象
  • 使用LocalBroadcastManager对象的sendBroadcast方法发送的广播,只能在应用内部传递。
  • 使用LocalBroadcastManager对象注册的广播,只接受应用内部的广播。