我观察到一种模式,其中所有BroadcastReceiver
都创建了一个Service
。我同意长期运行的过程需要service
。
为所有service
创建一个BroadcastReceiver
并使用BroadcastReceiver
只是为了接收广播广播到service
有什么好处吗?
可以在BroadcastReceiver
本身中运行非复杂的操作/任务吗?有什么缺点或反模式吗?
答案 0 :(得分:1)
使用BroadcastReceivers时,它实际上取决于需要完成的工作量。
如果工作足够轻便并且并且可以在10秒内完成,那么可以直接通过 onReceive()方法运行它。对于此类轻型工作,启动服务只是为了轻松完成该工作就没有多大意义了。
在BroadcastReceiver中进行工作只有3种真正的危险:
在后台线程中进行工作可能会导致在完成所有工作之前杀死BroadcastReceiver。一旦到达onReceive()
的结尾,BroadcastReceiver的进程将被视为低优先级进程,因此,如果系统需要,它可能会被杀死。 因此,在后台进行工作可能会导致您的工作无法正常完成,如果要将数据插入数据库中,这将非常危险。
在主线程上进行操作以避免
到达onReceive()
的结尾。我已经看到开发人员这样做是为了解决上一个问题,这可能由于可能在主线程上做太多工作而导致性能问题。我确定您知道这是一件坏事的原因。
做太多的工作并且超过10秒将导致系统认为您的应用没有响应。
当然,您实际上可以通过goAsync()
方法来请求扩展后台工作的限制,但这不是您应该使用的方法,而不是服务。
因此,我提到了这3种危险,为什么进行更多工作的流行解决方案是将工作传递给适当的Service或JobScheduler,这是有道理的。
因此,真正由您决定哪个最适合您的用例。
如果工作真的很轻松,那么在BroadcastReceiver中进行工作就没有问题。
如果工作轻巧但数据很重要且不会冒险,则可以考虑在服务中进行。
如果工作很繁重,则一定要通过“服务”来完成,或者将其安排为JobScheduler中的工作。
但是说实话,我的一般建议是谨慎使用BroadcastReceivers。仅在必要时使用它们,因为注册的BroadcastReceivers和服务过多会影响您应用的性能。