1

我对服务有疑问。

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

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

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

该段提到“密集或阻塞操作”,但没有提到 ANR 错误,它提到了性能。那么服务是如何工作的呢?

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

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

是这样吗?谢谢 =)

4

1 回答 1

1

我认为您必须在服务中创建一个线程,否则它会阻塞主线程并且您会收到 ANR 错误。

正确的。

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

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

Service是否默认在主线程的后台运行?

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

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

是的。

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

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

于 2013-09-21T01:28:48.597 回答