我对android服务和java线程感到困惑。
请帮助我了解我应该在哪种情况下使用它们。
根据我的理解
服务在后台运行,所以做线程。
服务用于网络操作或在后台播放mp3等活动,线程也是如此。
那么他们之间的实际差异以及何时使用他们中的每一个。
答案 0 :(得分:34)
让我打个比方。
活动和服务就像项目一样。
活动就像外部项目。这是客户(用户)看到的内容。
服务就像内部项目。一个外部项目可能有几个内部项目,或者根本没有。
您可以“暂停”外部项目,但支持它的内部项目仍可继续。
主线程就像公司的老板
老板不应该被太多的工作所困扰,因为他不应该迟到会议(UI冻结)或客户(用户)会不高兴。
主题就像公司的员工一样。
你拥有的越多,你可以同时做的事情就越多,只要你拥有足够的设备(CPU速度)。
多名员工可以同时处理同一个项目,但老板应该只对活动有所帮助。
答案 1 :(得分:6)
我认为主要区别在于Android系统的态度。服务是android基础架构的一部分,因此android将服务视为应用程序的工作部分,并将杀死服务视为最后一个选项。此外,如果您的服务被终止(例如由于内存不足),您可以说系统会在资源再次可用时自动重新启动它。此外,您可以调整服务优先级,以便像前台活动一样重要。至于线程,android不会将线程识别为必须保留的重要部分。所以通常的线程最终有很多机会被杀死。
例如,如果你有一个活动启动一个工作线程然后去后台,因为android不认为线程是一个工作部分,它可能认为应用程序什么也不做,因为没有活动或服务运行并杀死整个应用程序,包括工作线程。
因此,当您启动服务时,您告诉系统类似于:"嗨。我在这里做生意,在我结束之前不要杀了我。"和Android注意你的要求。
答案 2 :(得分:5)
始终:您的应用程序的服务不仅可以由您的应用程序的其他组件使用,也可以由其他应用程序使用。
服务用于程序的非GUI部分。
主要是:服务比线程更独立。服务比线程更长寿。服务比线程更复杂。
顺便说一句,线程不仅仅在后台运行。什么在前台运行,也是一个线程。
答案 3 :(得分:4)
服务更类似于无头活动。
要理解的重要一点是,服务是关于管理应用程序生命周期以及当应用程序不在前台(没有UI可见)时保持工作运行的能力。它还提供了向其他应用程序公开功能的能力。
http://developer.android.com/reference/android/app/Service.html#WhatIsAService
通常,在启动服务时,您还将启动工作线程。清单中有一些设置可以导致服务在新流程中启动,但通常您不需要这样做,这会使您与服务的通信更加困难。
当您需要在应用程序位于前台时从UI线程卸载工作时,在Activity中使用一个正确的线程,但是当您不再处于前台时,此工作可能会停止。 (有可能你的应用程序将继续运行,而不是前景,但不能保证取决于许多因素)一般来说,如果Android不在前台,并且你的应用程序进程有没有可以杀死的活动或服务。
使用带线程的服务来完成当您的应用在后台时发生的工作,并且您希望更好地保证生命周期。
使用服务向其他应用程序公开非UI功能。
答案 4 :(得分:2)
根据Android开发人员指南(http://developer.android.com/guide/components/services.html#Basics):
即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。
如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。
请记住,如果您确实使用了服务,它默认仍会在您的应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建新线程。
答案 5 :(得分:1)
Android Service
不在单独的进程中运行(默认情况下),甚至不在单独的线程中运行!它在应用程序的主线程(UI线程)中运行,因此如果您想在Service
中执行一些耗时的任务,请自行启动一个单独的线程,或使用IntentService
。
答案 6 :(得分:0)
为什么我们需要服务是为了避免资源紧张。
例如,您在打开另一个应用程序之后打开了一个应用程序,因此在您的应用程序添加到后台任务时。
在打开多个应用程序时,您的应用程序可能会被android系统杀死。因此,如果您的应用具有服务,则不会因为服务具有更高的优先级而被系统杀死,即使它可能杀死应用具有服务,因此我们在onStartCommand()
中使用常量返回类型。方法。那是START_STICKY,START_NOT_STICKY
和DELIVER_INTENT
。