Android 基础面试题-- Android的广播类型有哪些?

7 阅读5分钟

Android的广播类型有哪些?

回答要点

Android的广播类型主要分为三种:标准广播、有序广播和本地广播(Local Broadcast)。

  1. 标准广播:这种广播会被系统立刻发送给所有注册了这个广播的接收者,不论是应用内的还是应用外的。这种广播是异步的,各个接收者之间没有优先级概念。
  2. 有序广播:这种广播按照注册时设定的优先级顺序发送(优先级高的先接收到)。接收者可以决定是否将广播继续传递下去,还能修改广播内容。
  3. 本地广播(Local Broadcast):这种广播只能在应用内使用,它不会离开应用的进程空间,因此效率较高、更加安全。
补充说明,挑重点
  1. 标准广播: 标准广播的发送方式比较简单,使用context.sendBroadcast(Intent intent)来发送。然而,由于这种广播是异步的,所以无法确定接收顺序,也无法直接得到发送结果。
  2. 有序广播: 有序广播则通过Context.sendOrderedBroadcast(Intent intent,String receiverPermission)发送,这样可以控制接收顺序。每个接收者在处理广播时,可以决定是否中止广播的继续传递,以及对Intent 做一些修改。需要注意的是,从Android8.0开始,对于广播的优先级控制变得更加严格,很多场景下有序广播也会受到一定的限制。 比如说,用优先级来拦截低优先级广播:
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
filter.setPriority(1000); // 优先级设置
registerReceiver(myReceiver, filter);
  • 需要注意的是,从Android8.0开始,对于广播的优先级控制变得更加严格,很多场景下有序广播也会受到一定的限制。
  1. 本地广播: 本地广播通过LocalBroadcastManager来发送和接收:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.sendBroadcast(intent);
localBroadcastManager.registerReceiver(localReceiver, filter);
  • 优点是可以保证广播不离开应用进程,既提高了效率,又增加了安全性。
  1. 广播接收者(BroadcastReceiver): 每种广播都可以通过 BroadcastReceiver 来接收。一个广播接收者需要在AndroidManifest.xml中声明或通过代码注册:
// 在代码中注册广播接收者
IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");
registerReceiver(myBroadcastReceiver, filter);
  1. 动态和静态注册: 静态注册:通过AndroidManifestxml文件注册,应用程序未启动时也能接收广播,例如接收手机启动完成广播。 动态注册:代码中注册,需要在生命周期合适的时候注册和注销,比如在Activity的onstart()和onstop()方法中。

二、开始表演

Android 中的广播类型有哪些?

Android的广播类型主要有三种:标准广播、有序广播和本地广播。标准广播是完全异步的,所有按收者同时接收;有序广播按照优先级顺序发送,接收者可截断或修改广播;本地广播仅在应用内部传播,安全性高且效率好。

标准广播的特点是什么?

标准广播是一种异步广播,系统会将其快速发送给所有匹配的广播接收者,不分先后顺序,也无法确定接收顺序。它通过Context.sendBroadcast()发送,接收者之间相互独立,不能截断广播或传递数据。

有序广播与标准广播的区别是什么?

有序广播按照接收者注册时设置的优先级依次处理,高优先级的接收者先收到广播,可以决定是否中止广播传递,还可以向下一个接收者传递数据;而标准广播是异步并发的,所有接收者无法同时接收,无法截断。

如何发送有序广播?

使用 Context.sendOrderedBroadcast(Intent intent,String receiverPermission)方法发送有序广播。可以通过 IntentFilter.setPriority() 设置接收者的优先级,高优先级的接收者会优先接收到广播。

本地广播有什么优势?

本地广播只能在应用内部传播,不会泄露到其他应用,因此更加安全;同时它不经过系统全局广播机制,效率更高,也不会受到Android 8.0以上对隐式广播的限制。

如何实现本地广播?

通过 LocalBroadcastManager 实现本地广播。使用LocalBroadcastManager.getInstance(context).sendBroadcast(intent)发送广楼,通过registerReceiver( )注册接收者。该方式只在应用内生效,通合组件间通信。

广播接收者 BroadcastReceiver 如何注册?

BroadcastReceiver 可以通过两种方式注册:静态注册,在AndroidManifest.xml中明,适用于应用未启动时也能接收广播;动态注册,在代码中调用registerReceiver()方法,通常在Activity或Service的生命周期中注册和注销。

静态注册和动态注册的区别是什么?

静态注册是在AndroidManifest.xml 中配置,即使应用未运行也能接收特定广播(如开机启动);动态注册在代码中通过registerReceiver()完成,只有在注册后才有效,需在合适生命周期注册,适合临时监听。

从Android8.0开始对广播有哪些限制?

从Android8.0开始,禁止应用通过静态注册方式接收大多数隐式广播(不针对特定应用的广播),以减少后台开销。开发者应使用动态注册或本地广播来替代,仅允许部分例外广播(如开机完成)仍可静态注册。

能否在 BroadcastReceiver 中执行耗时操作?

不能。BroadcastReceiver的onReceive()方法运行在主线程中,执行时间有限(一般为10秒),超时会导致ANR。若需执行耗时任务,应启动Service或使用 WorkManager 等后台机制处理。