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