何时使用Android中的线程/服务?

什么时候应该使用线程或服务

他们是否应该用于authentication? 例如,在我的应用程序中,我正在考虑使用线程或服务(我通过Active Directory进行身份validation)。

你有什么时候会被使用的例子吗?

一个线程应该在长时间运行的进程中使用,这会阻止用户界面的更新。 如果超过一秒钟或两秒钟,您可能需要将其放入后台线程,并通过对话框或微调器或其他方式通知用户。 如果您将UI线程locking超过5秒钟,操作系统将提示用户“杀死或等待”选项。

服务不会在单独的线程上运行,因此它会阻塞UI,但是您可以在服务中产生新的线程。 一个服务用于更多的事情应该发生在一个时间间隔或保持运行/检查的东西,当没有界面显示。

更新:看来Android文档现在包含相应的说明,请参阅http://developer.android.com/reference/android/app/Service.html#WhatIsAService

原始答案:

在Android中,一个Service不提供任何并发的执行(“在后台运行”)。 它实际上更多的是一个简单的Java对象,它只是通过Android系统实例化(和pipe理),而不是通过new的应用程序。

因此,服务最重要的属性不是推迟工作量; 这可以用简单的线程来实现。

使服务对象特别的是它作为服务注册到Android系统。 这让系统知道这个对象提供了某种服务, 应该尽可能保持活动,或者直到它停止。 正常的应用程序线程对于Android系统并没有这个特殊的含义,并且在系统的判断下会被终止得更加慷慨。

所以,如果你需要一些后台活动,只有当你的应用程序/ Activity是活跃的,一个线程可以做你需要的。

如果你需要一个保持活跃的组件,即使在一段时间后,Android系统决定从内存中删除你的Activities ,你也应该去寻求服务,甚至是一个“前台服务”,这被视为更多系统是重要的,甚至不太可能被终止回收资源。

当然,如果需要的话,一个Service对象也可以包含一个或多个Thread实例,这个实例只要Service对象本身就可以运行。

编辑:

哦,另外:当然,如果你想为其他应用程序提供一些服务,服务是可以“绑定”到服务的。

看看这个漂亮的Android线程构造(第4部分):比较 。

或服务,asynchronous任务和线程之间的区别? 。

如果您需要某些由其他应用程序使用或超出应用程序活动的内容,请使用服务。 服务的一个很好的例子是文件传输,可能需要很长时间,而且您不希望在此期间强制用户使用您的应用程序。 在其他情况下使用线程(通常通过AsyncTask或类似的)。

为了进行身份validation, AsyncTask似乎是一个不错的select。

我相信主要区别在于Android系统的态度。 服务是Android基础设施的一部分,因此android将服务识别为应用程序的一个工作部分,并认为查杀服务是最后一个选项。 而且,您可以调整服务优先级,以便像前台活动一样重要。 至于线程,android不会把线程识别为必须保留的重要部分。 所以平常的线程有更多的机会被杀死。

例如,如果你有一个活动,启动一个工作线程,然后去背景,因为Android不认可线程作为工作部分,它可能认为应用程序什么都不做,因为没有活动或服务运行和杀死整个应用程序,包括工作线程。

根据Android开发者指南( http://developer.android.com/guide/components/services.html#Basics ):

服务只是一个组件,即使用户没有与应用程序交互,也可以在后台运行。 因此,只有在您需要的情况下才能创build服务。

如果您需要在主线程之外执行工作,但仅在用户与应用程序进行交互时执行工作,则可能应该创build一个新线程而不是服务。 例如,如果你想播放一些音乐,但只有在你的活动正在运行时,你可以在onCreate()中创build一个线程,在onStart()中开始运行,然后停在onStop()中。 另外考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。 有关线程的更多信息,请参阅“进程和线程”文档。

请记住,如果您确实使用了服务,那么它仍然会在您的应用程序的主线程中默认运行,所以如果它执行密集或阻塞操作,您仍然应该在服务中创build一个新的线程。