我有一个
Android应用程序需要在后台和单独的线程执行工作.对于我的第一个概念验证,我将应用程序类和内部onCreate()子类化,我产生一个执行后台工作的线程.这个工作很棒.不过,我只是意识到,在过去我已经为这样的情况使用了一个服务.
问题是,是否有理由在由服务而不是由Application.onCreate()产生的线程中生成的线程进行工作?该服务应该执行“背景”工作(它使用UI线程,除非使用线程,我知道)独立于活动,并且可以在没有活动可见时运行.使用基于应用程序的线程似乎也完成了所有这一切.通过不使用服务,它实际上消除了复杂性,因为Activity刚刚访问应用程序单例.据我所知,我没有必要约束服务.
在使用服务时会遇到一些生命周期角落的情况吗?这是我对这种方法的唯一关切,但否则我不会因为服务的好处而出售.
解决方法
不同之处在于,如果您希望线程仅在活动运行时运行,或者您希望在用户离开时继续运行该线程.
即使活动不再可用,服务也能在后台运行.当您的应用程序在不久的将来继续进行工作而没有任何用户参与时,它们将被使用.如果您在服务中运行线程,即使用户离开应用程序,线程也将继续运行.这可能是有益的,因为用户可能希望您继续下载一个非常大的文件,但不希望应用程序继续在前台运行.然后,几个小时(几天,几个月,几年),用户可以重新输入应用程序来读取文件.
但是,如果您使用的线程需要根据结果不断更新UI,那么在Activity中启动它可能会更有用,因为它没有真正的目的来运行在服务中.如果您的线程在“活动”而不是“服务”中,则您的线程可能更容易与UI通话. (可能有一些性能优势,因为Android不需要处理另一个服务的列表,但这是纯粹的猜测,我没有证据.)
注意:即使活动退出,在活动中创建的线程仍将继续运行.但是,这只是因为应用程序仍然在内存中.当Activity不再在视图中时,Activity及其线程的优先级要比内存中的优先级要低于Service线程.