了解Android服务和线程

时间:2013-09-21 01:14:34

标签: android multithreading service

我对服务有疑问。

我知道服务在后台运行,但我认为你必须在服务中创建一个线程,否则会阻塞主线程,你会得到一个ANR错误。

我以为我明白了!但后来我在Android开发者指南中读到了这个:

  

...如果您的服务在用户与同一应用程序中的活动进行交互时执行密集或阻止操作,则该服务将降低活动性能。为避免影响应用程序性能,您应该在服务中启动一个新线程。>

该段提到“密集或阻塞操作”,但未提及ANR错误,它提到了性能。那么服务如何运作?

假设某个活动启动了一项服务。默认情况下,服务是否在主线程的后台运行?这意味着您仍然可以在服务运行时使用您的活动,但由于您的活动和服务共享主线程的资源,它会降低您的活动性能,如果Service正在进行CPU密集型工作,它可能会离开没有资源可供使用,最终会出现ANR错误。

最佳实践(但不一定,如果服务正在轻松工作)将在服务中启动一个新线程,现在活动和服务正在使用自己的线程资源。然后你可以关闭你的活动,但Android保持服务线程活着。

是吗?谢谢=)

1 个答案:

答案 0 :(得分:1)

  

我认为你必须在服务中创建一个线程,否则会阻塞主线程,你会得到一个ANR错误。

正确。

  

该段提到“密集或阻塞操作”,但未提及ANR错误,它提到了性能。

随时在http://b.android.com提交错误报告,以便他们改进文档的这一部分。 : - )

  

默认情况下,服务是否在主线程的后台运行?

在主应用程序线程上调用Service的生命周期方法,例如onCreate()onStartCommand()。某些服务(例如IntentService)将为您提供后台线程(例如,onHandleIntent()),但这特定于Service的特定子类。

  

最终你会得到一个ANR错误。

  

最佳实践(但不一定,如果服务正在轻松工作)将在服务中启动一个新线程,现在活动和服务正在使用自己的线程资源。然后你可以关闭你的活动,但Android保持服务线程活着。

基本上,是的。在这里,“轻工作”应该小于一毫秒左右。此外,您可能会做的一些事情自然是异步的(例如,通过MediaPlayer播放一首歌),因此Service本身可能不需要自己的线程,因为它是其他的东西。使用正在进行线程化。