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

时间:2019-02-08 04:08:35

标签: android broadcastreceiver android-intentservice

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

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

可以在BroadcastReceiver本身中运行非复杂的操作/任务吗?有什么缺点或反模式吗?

1 个答案:

答案 0 :(得分:1)

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

如果工作足够轻便并且并且可以在10秒内完成,那么可以直接通过 onReceive()方法运行它。对于此类轻型工作,启动服务只是为了轻松完成该工作就没有多大意义了。

在BroadcastReceiver中进行工作只有3种真正的危险:

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

  • 在主线程上进行操作以避免 到达onReceive()的结尾。我已经看到开发人员这样做是为了解决上一个问题,这可能由于可能在主线程上做太多工作而导致性能问题。我确定您知道这是一件坏事的原因。

  • 做太多的工作并且超过10秒将导致系统认为您的应用没有响应。

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

因此,我提到了这3种危险,为什么进行更多工作的流行解决方案是将工作传递给适当的Service或JobScheduler,这是有道理的。

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

  1. 如果工作真的很轻松,那么在BroadcastReceiver中进行工作就没有问题。

  2. 如果工作轻巧但数据很重要且不会冒险,则可以考虑在服务中进行。

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

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