我正在寻找最佳做法,以制作背景更新程序。 我有这个活动序列
SplashScreen -> LoginScreen -> MainActivity
我需要的是在MainActivity开始之前执行更新。我正在使用volley lib进行下载。我想要Activity / Singleton / Service / Something,它与SplashScreen同时启动。并且MainActivity的启动必须等到后台更新程序完成。我想
更新程序对象行为: 检查版本,如果存在更新版本,请下载包含源的存档。 尝试应用更改(解析xml和许多应该崩溃的事情)。 应用更改。 启动应用。
我的想法: 1)使updater成为一个Activity:但是我想下载很多位,5秒的splashscreen等待会减慢这个过程。据我所知,背景活动不存在。 (是的,确实如此,它的服务......) 2)让他们成为一项服务:我从未使用过服务,所以我不确定这是最好的方式。更新后有24小时关闭计时器。甚至可以从服务启动Activity? 3)Singleton(静态类,或者什么,什么不是活动,也不是服务):作为服务,但是应该存在需要上下文的访问选项的问题。如果我得到它,将上下文从Splashscreen更改为loginscreen shloud就成了问题。 4)AsyncTaks:如前所述,如何等待asynctaks开始活动?
我错过了什么吗?有些练习适合我的问题吗?
任何人都可以给我一些类的例子以及它们之间的联系,这将是这个问题的最佳解决方案吗?
答案 0 :(得分:2)
选项4,AsyncTask,是您想要做的事情的好选择。
选项1(活动)不好,因为系统可能出于多种原因(例如屏幕旋转)破坏活动。从活动生命周期方法(onCreate等)调用的代码在UI线程上执行。您不希望在此线程上执行网络活动。这是一个糟糕的做法导致UI缓慢。如果您尝试这样做,较新版本的Android将抛出异常(阅读安全模式)。
选项2(服务)并不错,但编码服务并不像AsncTask那么简单。 Plus服务往往用于更长时间的运行。这是一篇SO帖子,很好地解释了这一点:Android: AsyncTask vs Service。
选项3(Singleton)并不好,因为如果内存不足,Android可以随时终止您的进程。如果您的单例具有状态,则在重新创建进程时,该状态将丢失。有办法解决这个问题,但它们很难并容易出错。
所以我建议您阅读AsyncTasks。它们在Android中非常有用。它们为您提供来自预先存在的线程池的线程,以及帮助您确保代码在正确类型的线程(例如UI或背景)上执行的类方法。
======
因此,这适用于您的情况:
当然这只是一个建议,如果不知道你的应用,我不能说它是最佳的。希望这能让您体验AsyncTask的使用。