何时使用以及何时不在Android中使用服务

Igo*_*daš 13 android android-service android-lifecycle

我已经为Android开发了不到两年的时间,我仍然对这个看似简单的问题感到困惑.应该何时实施服务?根据我的经验,有一些罕见的情况,但我对此提出质疑,因为在每部手机上都运行了很多,我怀疑它只是一个糟糕的应用程序设计.

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

在我开发的所有应用程序中,只有一个真正需要服务.这是一个背景录音机,因为我希望按钮能够控制它(就像音乐播放器那样),我将它作为Foreground服务用于通知.

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

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

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

C)我知道Android中的服务与Windows中的服务完全不同,因为在Android服务中只是用于组织代码的"包",并且系统管理对象的生命周期.服务使用主线程,但习惯上在其中生成新线程.

D)在开发文档中建议使用服务进行网络通信和后台计算,但我不明白为什么你不应该只使用AsyncTasks.我非常喜欢这些并广泛使用它们,从下载数据到在时间紧迫的条件下进行FFT计算.

E)我得到了Foreground服务的有用性,但为什么人们使用后台服务这么多(不包括系统应用程序).

这些是我对服务的看法,我希望有经验的人能够解释这些PROS和CONS(以及我可能错过的其他人).

Com*_*are 17

应该何时实施服务?

当你有工作 - 为用户提供价值 - 时:

  • 需要一些时间才能完成,或许比您希望完成工作的组件有更长的时间,或者

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

  • 在极少数情况下,需要持续运行,因为它不断提供价值

它们中有很多都在运行,我怀疑它只是一个糟糕的应用程序设计

有些可能是糟糕的实施,无论是由于技术上的误解,还是其他问题(例如,让营销变得快乐)都会让用户满意.

这是一个背景录音机,因为我希望按钮能够控制它(例如音乐播放器),我将它作为前景服务用于通知

这是一项合理的服务,恕我直言.

Intent侦听器是一个非常有用的功能,如您所知使用它们通常足以用于许多用例(例如显示通知)

我假设"意图听众"是指明显注册BroadcastReceiver的.在这种情况下,如果要完成的工作BroadcastReceiver需要花费超过一毫秒的时间,那么该工作应该委托给IntentService完成.onReceive()在主应用程序线程上调用,并且清单注册BroadcastReceiver为裸线程分叉是不安全的,因为进程可能在onReceive()返回后不久就消失.但是,在这些情况下,服务通常是短暂的(例如,执行一些网络I/O和磁盘I/O,然后消失).

在开发文档服务建议网络通信和后台计算,但我不明白为什么你不应该只使用AsyncTasks

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

  • 由UI(活动或片段)请求,和

  • 将花不到一秒左右,并且

  • 不重要

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

相反,如果用户通过您的应用程序购买MP3,并且您需要下载该MP3文件,AsyncTask则不是一个好的解决方案.这可能很容易占用一秒钟.在下载过程中,用户可以切换远离应用程序(例如,按HOME).此时,您的流程有资格终止...可能在您的下载完成之前.使用a IntentService来管理下载是向操作系统发出的一个信号,你正在这里工作,为用户增加价值,因此这个过程将保持一段时间.

请注意,如果后台工作可能需要15秒以上,WakefulBroadcastReceiver或者我WakefulIntentService可能是个好主意,那么当您尝试完成这项工作时,设备不会入睡.