android - 何时使用和何时不使用 Android 中的服务

标签 android android-service android-lifecycle

我从事Android开发不到2年,对于这个看似简单的问题我还是很疑惑。 什么时候应该实现一项服务? 根据我的经验,有一些罕见的情况,但我对此表示质疑,因为在每部手机上都有相当多的人在运行,我怀疑这只是一个糟糕的应用程序设计。

这基本上是我问题的核心,但以下是我对这个主题的一些经验和想法,可以更详细地解释我的问题。

在我开发的所有应用程序中,只有一个真正需要服务。它是一个背景录音机,我将它用作带有通知的前台服务,因为我希望按钮能够控制它(例如音乐播放器)。

除此之外,我从未真正看到对持续运行服务的需求,因为:

A) Intent 监听器(Manifest 注册的 BroadcastReceivers)是一个非常有用的功能,如您所知,使用它们通常足以满足许多用例(例如显示通知)。

B) 如果计划执行是必须的,可以订阅警报事件。

C) 我知道 Android 中的服务与 Windows 中的服务有很大不同,因为在 Android 中,服务只是一个“包”,用于组织您的代码并让系统管理对象的生命周期。服务使用主线程,但通常会在其中生成新线程。

D) 在开发文档中,建议将服务用于网络通信和后台计算,但我不明白为什么你不应该为此使用 AsyncTasks。我是这些工具的忠实粉丝,并且将它们广泛用于很多事情,从从互联网下载数据到在时间紧迫的条件下进行 FFT 计算。

E) 我了解前台服务的用处,但为什么人们如此频繁地使用后台服务(不包括系统应用程序)。

这些是我对服务的看法,我希望有更多经验的人能够解释这些优点和缺点(以及我可能错过的其他优点和缺点)。

最佳答案

When should one implement a service?

当您有工作时 - 为用户提供值(value) - 那:

  • 需要一些时间来完成,可能比您在希望完成工作的组件中的时间要长,或者

  • 在用户控制下传递该值(value)(例如,音乐播放器,由 UI 中的播放/暂停按钮控制),或者

  • 在极少数情况下,需要持续运行,因为它会持续交付值(value)

there are quite a lot of them running and I doubt it's just a poor application design

有些可能实现不佳,要么是由于技术误解,要么是其他顾虑(例如,让营销开心)胜过让用户开心。

It was a background sound recorder and I was using it as Foreground service with notification since I wanted buttons to be able to control it (like music players do for example)

恕我直言,这是对服务的合理使用。

Intent listeners are quite a useful feature and using them as you know is usually enough for many use-cases (for example showing notifications)

我假设“Intent 监听器”是指 list 注册的 BroadcastReceiver。在这种情况下,如果要由 BroadcastReceiver 完成的工作将花费超过一毫秒的时间,则该工作应该委托(delegate)给 IntentService 来完成。 onReceive() 在主应用程序线程上调用, list 注册的 BroadcastReceiver 派生一个裸线程是不安全的,因为该进程可能会在不久后消失onReceive() 返回。然而,在这些情况下,服务通常是短暂的(例如,进行一些网络 I/O 和磁盘 I/O,然后就消失了)。

In the development documentation services are suggested for network communication and background calculations but I don't get why you should not just use AsyncTasks for that

AsyncTask 是一个很好的后台工作解决方案:

  • 由 UI( Activity 或 fragment )请求,以及

  • 将花费不到一秒钟左右的时间,并且

  • 不重要

例如,如果您正在下载头像以在 ListView 中显示,AsyncTask 可能是一个不错的选择,无论您是直接使用它们还是使用一些图像获取库在内部使用它们。

相反,如果用户通过您的应用购买了 MP3,而您需要下载该 MP3 文件,AsyncTask 并不是一个好的解决方案。这很容易接管一秒钟。在下载过程中,用户可以离开应用程序(例如,按 HOME)。到那时,您的进程就有资格终止……也许在您的下载完成之前。使用 IntentService 来管理下载是向操作系统发出的信号,表明您确实在此处工作,为用户增加了值(value),因此该过程将暂时搁置一段时间。

请注意,如果后台工作可能需要 15 秒以上,WakefulBroadcastReceiver 或我的 WakefulIntentService 可能是个好主意,这样设备在您尝试时不会睡着结束这部分工作。

关于android - 何时使用和何时不使用 Android 中的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148724/

相关文章:

android - 如何以编程方式最小化电话调用?

android - 如何计算日期?我有天数 + 开始日期和查找结束日期

android - AsyncTask 和 Activity 怎么做

Android服务在应用程序被杀死后停止

android - 无法复制 list

android - INTENT.ACTION_CALL 在后台

android - Android 应用程序中的设计建议

java - 如何使用 ProcessLifecycleOwner 捕捉生命周期事件?

java - Android 中的 `finishAffinity();` 和 `finish()` 方法有什么区别?

android - RuntimeException :ClassNotFoundException android. arch.lifecycle.ProcessLifecycleOwnerInitializer