32

将冗长的网络访问代码放置在活动中的线程或服务中的线程中的优点/缺点是什么?它将如何影响申请?我正在编写一个流式音频播放器,从我目前所读的内容来看,将代码放入服务中最终仍会阻塞应用程序,因此需要一个新线程,有谁知道放置这段代码是否更有意义在一项服务中。

4

3 回答 3

39

是的,服务中的阻塞操作仍然会阻塞应用程序。尽管第一次出现,服务并不仅仅用于在后台运行任务。它们用于运行具有独立于 Activity 生命周期的生命周期的任务(IE,它们可能会在 Activity 关闭后继续)。

一个在 Activity 启动时启动并在 Activity 结束时结束的 Service 是无用的。

在您的情况下,您正在流式传输音频,即使在用户关闭 Activity 后,您也可能希望流式传输音频,在这种情况下,您应该使用服务,但您仍然需要一个线程(或 AsyncTask)来阻止任务.

于 2010-04-13T21:46:56.700 回答
2

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

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

唯一的区别可能是服务可以在不完全破坏应用程序的情况下被破坏——因此可能会破坏新线程。为什么是潜在的?因为在实际方面,这不会发生。应用程序总是在没有杀死服务的情况下被杀死,这意味着:本地服务机制没用!!!

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

祝你好运!!!

于 2012-03-22T14:56:57.940 回答
0

不同之处在于系统如何管理您的应用程序进程生命周期。运行线程不会影响应用程序进程的生命周期,但服务会。

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

但是不要急于创建后台服务,现在有更现代的方法来处理后台任务。考虑下面和后台处理指南中描述的替代解决方案,并记住与后台服务相关的所有限制。

如果一个线程执行一个任务,结果只有一个活动需要,线程生命周期应该绑定到活动。在这种情况下,不需要任何服务。这就是所谓的即时任务ViewModel + Kotlin Coroutines + ViewModelScope是处理它的好方法,有关不同类型的后台任务的更多详细信息,请参阅后台处理指南。

如果无论用户是否关闭您的应用程序都应该完成任务并且不需要立即执行它,请考虑使用WorkManager这是处理此类延迟任务的好方法。请参阅Android 工作管理器与服务?更多细节。

否则,如果您有一个生命周期未绑定到活动/片段的即时任务,那么前台服务可能是最佳选择,尤其是在音频播放器的情况下。从 Android 8 开始考虑后台服务存在一些限制,系统会在应用关闭后几分钟内停止应用的后台服务,因此不适合长时间运行任务。

于 2020-06-16T15:13:17.073 回答