什么时候应该使用线程或服务?
它们应该用于身份验证吗?例如,在我的应用程序中,我正在考虑使用线程或服务(我通过Active Directory进行身份验证)
你能举例说明什么时候使用这两种方法吗?
更新:似乎Android文档现在包含了相应的澄清,参见http://developer.android.com/reference/android/app/Service.html#WhatIsAService。
原始答:
在Android中,Service
不提供任何并发执行("后台运行")。它实际上是一个简单的Java对象,只是通过Android系统实例化(和管理),而不是通过new
的应用程序。
因此,服务最重要的属性不是延迟工作负载;这可以通过简单的线程实现。
服务对象的特殊之处在于它在Android系统中注册为服务。这让系统知道这个对象提供了某种服务,并且应该尽可能长时间地保持存活,或者直到它停止。正常的应用程序线程对Android系统没有这种特殊的意义,并且会根据系统的判断更慷慨地终止。
所以,如果你需要一些后台活动,只有当你的应用程序/Activity
是活动的,一个线程可以做你需要的。
如果你需要一个保持活跃的组件不会被清除,即使过了一段时间,Android系统决定从内存中删除你的Activities
,你应该去服务,甚至是一个"前台服务",这被系统认为更重要,甚至不太可能被终止回收资源。
当然,如果需要,Service
对象也可以包含一个或多个Thread
实例,这些实例可以与Service
对象本身一样长。
哦,另外:如果你想向其他应用程序提供一些服务,那么服务当然是方式,这些应用程序只能"绑定"到一个服务。
一个线程应该在一个长时间运行的进程中使用,这会阻止UI更新。如果时间超过一两秒你可能想把它放到后台线程中用对话框或旋转器之类的东西通知用户。如果你锁定UI线程超过5秒,操作系统将提示用户"杀死或等待"选项。
一个服务不会在单独的线程上运行,所以它会阻塞UI,但是你可以在一个服务中生成一个新线程。服务更多地用于应该间隔发生的事情,或者在没有显示UI时继续运行/检查某些事情。
看看这篇很棒的Android线程结构(第4部分):比较.
Service, Async Task &线程吗?。
如果您需要的东西被其他应用程序使用或比您的应用程序活动寿命更长,则使用service。服务的一个很好的例子是文件传输,它可能需要很长时间,您不想在此期间强迫用户使用您的应用程序。在其他情况下使用线程(通常通过AsyncTask或类似的)。
对于身份验证而言,AsyncTask
似乎是一个不错的选择。
我认为主要的区别在于Android系统的态度。服务是android基础设施的一部分,因此android将服务视为应用程序的一个工作部分,并将终止服务作为最后的选择。此外,您可以调整服务优先级,以便将其与前台活动一样重要。对于线程,android并不认为线程是必须保留的重要部分。所以普通线程有更多的机会被杀死。
例如,如果你有一个activity,它启动一个工作线程,然后进入后台,因为android不识别线程作为一个工作部分,它可能会认为应用程序什么也不做,因为没有活动或服务运行,并杀死整个应用程序,包括工作线程。
根据Android开发者指南(http://developer.android.com/guide/components/services.html#Basics):
服务就是一个可以在后台运行的组件,即使用户没有与你的应用程序交互。因此,您应该只在需要时才创建服务。
如果你需要在主线程之外执行工作,但只有当用户正在与你的应用程序交互时,那么你可能应该创建一个新线程而不是一个服务。例如,如果你想播放一些音乐,但只有当你的活动正在运行时,你可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还可以考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。
请记住,如果你使用一个服务,默认情况下它仍然运行在应用程序的主线程中,所以如果它执行密集或阻塞操作,你仍然应该在服务中创建一个新线程。