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

时间:2014-01-15 21:35:54

标签: android android-service android-lifecycle

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

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

在我开发的所有应用中,只有一个确实需要服务。这是一个背景录音机,因为我希望按钮能够控制它(例如音乐播放器),我使用它作为Foreground服务并发出通知。

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

  

何时应该实施服务?

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

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

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

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

  

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

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

  

这是一个背景录音机,因为我希望按钮能够控制它(就像音乐播放器那样),我使用它作为Foreground服务并发出通知。

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

  

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

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

  

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

AsyncTask是后台工作的理想解决方案:

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

  • 大约需要不到一秒钟,

  • 非关键

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

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

请注意,如果后台工作可能需要15秒以上,WakefulBroadcastReceiver或我的WakefulIntentService可能是一个好主意,因此设备在您尝试完成这一点时不会入睡工作

答案 1 :(得分:2)

我可以根据自己的经验命名一些服务用途:

实施

  1. 位置监听器,
  2. 声音模块,产生各种声音
  3. 在应用内容更新中,
  4. API,为其他应用提供服务
  5. in app billing
  6. 与webservices的通信(如果请求频率很高)
  7. 实际上(不包括5.)他们都在整个应用程序持续时间工作,他们正在使用其他一些Android服务,他们也管理他们的状态。我想这里重要的一件事是应用程序生命周期变化期间的状态管理。

    我更喜欢以与Executors(ExecutorService)相同的方式查看AsyncTasks,它们应该按顺序执行并执行小任务。

答案 2 :(得分:0)

如果你考虑UI和绑定服务,你会认为两者都可以存在而不是为certian期间做任何事情。在这种情况下,您的UI可以重新创建很多次,但服务却没有。这就是服务很重要的地方。假设您正在处理图像,然后在重新创建UI时旋转您希望处理的设备。您录制语音然后旋转设备。这些是我觉得服务非常重要的地方之一。 (有大量繁重的数据处理,与网络交互,可能需要几秒钟)

答案 3 :(得分:0)

在android网站上,您可以找到何时使用Service,Thread或WorkManager的表格(用于调度作业的新API,目前在此注释中为alpha)。 https://developer.android.com/guide/background/#table-choose

该网站还指出,您仅在万不得已时才需要使用启动服务。 Android平台将来可能不支持启动的服务。请参阅此链接https://developer.android.com/topic/performance/scheduling#services

  

您应该避免使用永久运行或执行定期工作的已启动服务,因为即使它们没有执行有用的任务,它们仍会继续使用设备资源。相反,您应该使用此页面描述的其他解决方案,这些解决方案提供本机生命周期管理。仅在万不得已时才使用已启动的服务。 Android平台将来可能不支持启动的服务。