始终为每个广播接收器创建服务?

create a service always for every broadcast receiver?

我观察到一个模式,其中所有 BroadcastReceiver 都创建了一个 Service。我同意漫长的 运行ning 过程需要 service

为所有 BroadcastReceiver 创建一个 service 并使用 BroadcastReceiver 只是为了接收广播并将其传递给 service 有什么好处吗?

BroadcastReceiver 本身中 运行 一个非复杂的 operations/task 可以吗?有什么缺点或反模式吗?

使用 BroadcastReceivers 时,它实际上取决于需要完成的工作量。

如果工作足够轻可以在10秒内完成,那么直接从onReceive()运行就可以了 方法。对于像这样的轻松工作,启动服务只是为了轻松完成这项工作意义不大。

在 BroadcastReceiver 内部工作只有 3 个真正的危险:

  • 在后台线程中工作可能导致 BroadcastReceiver 在所有工作完成之前被杀死。一旦到达 onReceive() 的末尾,BroadcastReceiver 的进程将被视为低优先级进程,因此如果系统需要它,它可能会被终止。 因此,在后台进行工作可能会导致您的工作无法正常完成,如果您将数据插入数据库,这是非常危险的。

  • 在主线程上工作以避免 到达 onReceive() 的末尾。我已经看到开发人员这样做是为了解决之前的问题,该问题由于可能在主线程上执行过多工作而导致性能问题。我相信你知道为什么这是一件坏事。

  • 做太多的工作,超过 10 秒会导致系统认为您的应用程序没有响应。

当然,您实际上可以通过 goAsync() 方法请求稍微延长后台工作的限制,但这不是您应该使用的方法,而不是服务。

因此,对于我提到的这 3 个危险,为什么做更多工作的流行解决方案是将工作传递给适当的服务或 JobScheduler 是有道理的。

因此,真正由您来决定哪个最适合您的用例。

  1. 如果工作真的很轻松,在 BroadcastReceiver 中完成工作没有问题。

  2. 如果工作很轻松但数据很重要且不能冒险,那么考虑在服务中进行。

  3. 如果工作繁重,一定要通过服务来完成,或者在 JobScheduler 中将其安排为作业。

但老实说,我的一般建议是谨慎使用 BroadcastReceivers。仅在必要时使用它们,因为注册的 BroadcastReceivers 和服务过多会影响应用的性能。