Android 四大组件之 Broadcast Receiver

  1. Android 中广播的类型
  • 标准广播
    一种完全异步的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播,因此它们之间没有任何先后顺序可言。
  • 有序广播
    一种同步执行的广播,在广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播消息,当这个广播接收器的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播信息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播信息了。

在使用 AS 创建广播时,Exported 属性表示是否允许这个广播接收器接收本程序以外的广播, Enabled 属性表示是否启用这个广播接收器

  1. 广播接收器的创建及动态注册
  • 新建一个类,继承 BroadcastReceiver,并重写父类的 onReceive 方法。这样当广播到来的时候就会得到执行,具体的逻辑就可以在这个方法中处理。
  • 通过 IntentFilter 来添加想要监听的广播,并调用 registerReceiver 来动态注册广播。动态注册的广播接收器一定都要取消注册才行,即 unregisterReceiver() 方法。
  1. 静态注册
    动态注册的广播接收器必须要在程序启动之后才能接收到广播,如果要让程序在未启动的情况下就能接收到广播,就需要用到静态注册的方式。 静态的广播接收器一定要在 AndroidManifest.xml 文件中注册才可以使用。如果使用 AS 的快捷方式创建的广播接收器,注册这一步会被自动完成。还需要在AndoidManifest.xml 文件中声明权限和监听的广播类型。

  2. 不要在 onReceive 方法里添加过多的逻辑或进行任何耗时的操作,因为在广播接收器中是不允许开启线程的,当 onReceive 方法运行了较长时间而没有结束时,程序就会报错。因此,广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。

  3. 使用自定义广播

  • 有序广播
Intent intent = new Intent("com.example.broadcasttest.MyBroadcast");
sendBroadcast(intent);
  • 无序广播
    广播是一种跨进程的通信方式,因此在应用程序内发出的广播,其他应用程序也是可以收到的。
Intent intent = new Intent("com.example.broadcasttest.MyBroadcast");
sendOrderedBroadcast(intent, null);
  1. 截断广播
abortBroadcast();
  1. 本地广播
    前面发送和接收的广播全部属于系统全局广播,容易引起安全性问题。
    本地广播机制能够使发出的广播只能够在应用程序内部进行传递,并且广播接器也只能接收来自本应用程序发出的广播。
    该机制使用 LocalBroadcastManager 来对广播进行管理,并提供了发送广播和注册广播接收器的方法。
    本地广播是无法通过静态注册的方式来接收的,也不需要。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容