如何正确管理Android后台任务?

时间:2015-12-28 23:29:47

标签: android multithreading android-asynctask

我已经阅读了许多其他类似的问题,但似乎没有解决我正在处理的具体问题。我的应用程序需要将数据从服务器同步到本地SQLite数据库。但是,在用户通过LogIn活动登录之后,此过程才能开始。登录活动的一个选项是"记住我"这意味着如果用户关闭应用程序并重新启动它,应用程序将自动登录"使用上次成功登录时保存的凭据。如果失败则将它们带到登录活动。因此,除了解释之外......数据的同步需要在后台线程中完成,并且应用程序将在后台更新数据时继续运行。到目前为止,我只是使用异步任务并启动如下任务:

dataManager = new DataManager();
dataManager.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

现在我的问题出现在这里。用户可以选择菜单选项"退出"。如果他们选择那么它会将他们带回登录活动。如果他们再次登录,我可能需要执行以下操作:

首先我必须检测是否已经有一个DataManager任务正在运行的实例。如果是,并且用户与以前登录的用户不同,则终止以前版本的DataManager任务并重新启动它。

如果用户是相同的,如果以前的版本正在运行(或甚至已经完成运行),则不执行任何操作,否则启动它。

此外,如果用户只是关闭应用程序并重新启动它而Android没有杀死任务,那么我不知何故需要检测并处理我是否应该创建DataManager的新实例。

此外,我可能会收到来自服务器的推送通知,通知应用程序执行相同的后台任务,因此我应该能够控制停止并重新启动任务。

最后还会有一个"刷新"菜单选项,当用户希望他们可以选择运行后台任务时(如果它尚未运行)。

由于数据已经更新到本地SQLite数据库,我希望能够执行广播以通知活动他们可以刷新"通过在可能受影响的活动上设置监听器来实现UI。

努力总结整个问题......

如何处理运行,停止,重新启动和检测单个后台任务实例的状态?

1 个答案:

答案 0 :(得分:-1)

Content Provider,SyncAdapter和AccountManager组合为您解决了这个问题。 (我写了这个,但是从随机人的回购中提取,因为它是用于MOOC作业,而我的版本不是公开的,但是......我的名字仍然是@author -_-)

AccountAuthenticatorService

LoginActivity

ContentProvider

ContentProvider SyncAdapter

我的个人观点是,您永远不应该有一个内容提供商包装您的SQLite数据库,但如果您完全使用互联网来同步数据,这当然是正确的。 (请注意,“内容提供商”不必像许多新的Android开发人员那样公开共享。)

SyncAdapter服务/管理器可让您轻松安排后台同步和/或按需同步。这样做的好处是您的应用程序不必一直运行服务或线程。您可以在需要时使用SyncManager手柄启动SyncAdapter服务。这样可以节省用户设备的电池寿命,有助于清楚地描述项目网络代码的位置。