我已经为Android开发了不到两年的时间,我仍然对这个看似简单的问题感到困惑。 应该何时实施服务? 根据我的经验,有一些罕见的情况,但我对此提出质疑,因为在每部手机上都运行了很多,我怀疑它只是一个糟糕的应用程序设计。
这基本上是我的问题的核心,但以下是我对该主题的一些经验和想法,可以更详细地解释我的问题。
在我开发的所有应用中,只有一个确实需要服务。这是一个背景录音机,因为我希望按钮能够控制它(例如音乐播放器),我使用它作为Foreground服务并发出通知。
除此之外我从未真正看到过对持续运行服务的要求,因为:
A)Intent侦听器(Manifest注册的BroadcastReceivers)是一个非常有用的功能,如您所知,使用它们通常足以用于许多用例(例如显示通知)。
B)如果计划执行是必须的,则可以订阅警报事件。
C)我知道Android中的服务与Windows中的服务完全不同,因为在Android服务中只是用于组织代码的“包”,并且系统管理对象的生命周期。服务使用主线程,但习惯上在其中生成新线程。
D)在开发文档中建议使用服务进行网络通信和后台计算,但我不明白为什么你不应该只使用AsyncTasks。我非常喜欢这些并广泛使用它们,从下载数据到在时间紧迫的条件下进行FFT计算。
E)我得到了Foreground服务的用处,但为什么人们使用后台服务这么多(不包括系统应用程序)。
这些是我对服务的想法,我希望有经验的人能够解释这些PROS和CONS(以及我可能错过的其他人)。
答案 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)
我可以根据自己的经验命名一些服务用途:
实施
实际上(不包括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平台将来可能不支持启动的服务。