应用程序线程与服务线程

时间:2010-04-13 21:24:30

标签: android multithreading service media-player

在活动中的线程或服务中的线程中放置冗长的网络访问代码有哪些优点/缺点?它会如何影响应用程序?我正在编写流媒体音频播放器,从我到目前为止所读到的内容中将代码放入服务中仍然会阻止应用程序,因此需要一个新的线程,是否有人知道放置这段代码是否更有意义在服务中。

3 个答案:

答案 0 :(得分:36)

是的,服务中的阻止操作仍会阻止该应用程序。尽管首次亮相,服务并不仅仅是为了在后台运行任务。它们用于运行任务,其生命周期独立于Activity生命周期(IE,它们可能会在Activity关闭后继续)。

在活动开始时开始并在活动结束时结束的服务无用。

在你的情况下,在流式传输音频的情况下,即使用户关闭了Activity,你也可能想要流式传输音频,在这种情况下,你应该使用服务,但是你仍然需要一个线程(或AsyncTask)阻止任务。

答案 1 :(得分:2)

根据我的经验(1年以上开发Android),在服务或活动中运行新线程没有区别。 尽量不要在新线程中保留对Activity的引用 - 使用应用程序上下文。

此外,服务的生命周期根本没有帮助,因为无法保证调用某些方法:(

唯一的区别可能是服务可以在不破坏应用程序的情况下销毁 - 因此可能销毁新线程。 为什么可能?因为在实际方面,这不会发生。应用程序总是被杀而不会在此之前终止服务,这意味着:本地服务机制无用 !!!

远程服务是一个不同的讨论 - 我只是指“我应该在哪里运行新线程?”。

祝你好运!!!

答案 2 :(得分:0)

区别在于系统如何管理您的application process lifecycle。正在运行的线程不会影响应用程序进程的生命周期,但是服务会影响。

要确定哪些进程在内存不足时应被杀死,Android会根据其中运行的组件以及这些组件的状态将其置于重要层次中。如果您的应用没有可见的活动或前台服务,但具有后台服务,则将其归类为服务进​​程,并且当优先级较低的缓存进程存在。但是,如果该应用既没有可见的活动/片段,前台服务也没有后台服务,则它被归类为缓存进程,并且可以随时被杀死以释放系统资源,无论它是否具有正在运行的线程是否。

但是,不要急于创建后台服务,如今有更多现代方法可以处理后台任务。考虑以下和background processing guide中所述的替代解决方案,并牢记与后台服务相关的所有限制。

如果线程执行仅活动需要的结果的任务,则线程生命周期应绑定到该活动。在这种情况下,不需要任何服务。所谓的immediate tasksViewModel + Kotlin Coroutines + ViewModelScope是一种很好的处理方式,有关各种后台任务的更多详细信息,请参见Guide to background processing

如果无论用户是否关闭了您的应用程序都应该完成任务,并且不需要立即执行,请考虑使用WorkManager,这是处理此类deferred tasks的好方法。有关更多详细信息,请参见Android Work Manager vs Services?

否则,如果您有立即任务,其生命周期未绑定到活动/片段,则可能是foreground service是最佳选择,尤其是在有音频的情况下播放器。自Android 8以来,有limitations个正在考虑后台服务的应用程序,该应用程序在关闭后的几分钟内会停止运行该应用程序的后台服务,因此它不是长时间运行任务的地方。