安卓广播总结

注册广播接收器

注册广播接收器可以在manifest文件中静态注册也可以在代码中用Context实例动态注册。需要注意的是,如果你在manifest中注册了广播接收器,当你监听的广播发出的时候,广播接收器都能接收到广播,而不管之前你的应用有没有运行。但是如果你是用context注册广播接收器的话,只有当你注册的context还有效的时候你才能接收到广播。比如你使用Activity来注册广播监听器,那么你只能在Activity还未销毁的时候才能接收到广播。如果你使用Application来注册广播接收器,那么你只有在应用运行的时候才能接收到广播。

注销广播接收器

对于使用context注册的广播接收器,如果你想停止接收广播,你可以使用unregisterReceiver(BroadcastReceiver)来停止接收。当你不再需要广播接收器或者context不再有效的时候你应该注销它。需要注意一下你注册和注销广播接收器的地方,以免出现内存泄漏。比如你在activity的onCreate(Bundle)中注册了广播接收器,你就应该在onDestroy()中注销它;如果你在onResume()中注册就应该在onPause()中注销。

发送广播

安卓提供了三总方法来发送广播

  • sendOrderedBroadcast(Intent, String)
  • sendBroadcast(Intent)
  • LocalBroadcastManager.sendBroadcast()

广播接收器对进程状态的影响。

广播接收器的状态能够影响容器进程的状态,也就是说这将影响它被系统杀死的可能性。比如当进程正在执行广播接收器的时候(当前执行的代码在onReceive方法中),该进程就会被视作为前台进程。系统将保证它的正常运行,除非内存极度缺乏的情况下才会杀死该进程。然而,一旦运行的代码从onReceive中返回之后,广播接收器就不再是活动状态。该宿主进程的优先级将由运行在该进程内的其他组件决定。如果进程内只包含一个在manifest中声明的广播接收器,那么一旦从onReceive中返回,系统将把它视作一个低优先级的进程并且可能将它杀死来为其他更重要的进程提供资源。基于以上原因,你不应该在广播接收其中开启后台进程,而应该使用goAsync()或者是JobService。

权限问题

  • 当你发送广播的时候,你能够指明一个权限参数,只有那些在manifest文件中申请了相应权限(如果是危险权限的话需要用户已经授权)的接收器能接收到该广播。
  • 当你注册广播接收器的时候,如果你指明了一个权限参数,那么只有那些在manifest文件中申请了相应权限(如果是危险权限的话需要用户已经授权)的应用能向改接收器发送广播。

其他注意事项

  1. 在安卓7.0及更高的版本中,一下的系统广播将不再发送。这个优化将影响到所有的应用,不仅仅是那些面向安卓7.0开发的应用。

    • ACTION_NEW_PICTURE
    • ACTION_NEW_VIDEO
  2. 那些面向安卓7.0(api 24)及更高的版本开发的应用必须使用registerReceiver(BroadcastReceiver, IntentFilter)来注册广播监听。在manifest文件中注册监听将不再起作用

    • CONNECTIVITY_ACTION
  3. 从安卓8.0(api 26)开始,系统对在manifest中声明的广播接收器增加了额外的限制。如果你的应用面向api 26或者更高,你将不能在manifest中声明接收隐式广播(没有特意指明发送给你的应用的广播)的接收器。