我的应用需要在后台下载大型xml文件,然后使用它们来更新数据库。我希望这些更新能够在后台自动发生,而不会打扰用户。这部分看起来很简单,似乎AsyncTask就是我在这里使用的。
但是,我也希望为用户提供一种方式:
1)当且仅当应用程序尚未更新时,手动启动更新
2)查看正在进行的更新的状态
以下是我现在看到的应用程序流程:
1)应用程序启动,主要活动开始
2)AsyncTask由主Activity自动启动以更新应用程序
3)用户从主菜单中选择“更新”
4)向用户显示更新活动
5)如果在后台进行更新:
--5A)用户看到进度条
--5B)否则,用户会看到开始更新的选项
我认为第4步到第5步是我的主要问题所在。 Update Activity是一个新的Activity,与主Activity不同。我不知道如何从Update Activity访问AsyncTask。
换句话说,我在一个Activity中启动AsyncTask,但我只希望AsyncTask在第二个Activity中显示其进度,可以随时打开和关闭。
我一直在探索的一些选项包括Service和BroadcastReceiver,但我不知道要做出一个好的决定。
感谢您的帮助。
答案 0 :(得分:1)
好的,经过大量的阅读和测试,这就是我最终如何做到的。
我有一个包含AsyncTask的Service(UpdateService)。应用程序启动时,也会自动启动UpdateService。如果不需要更新,UpdateService将停止。如果需要更新,UpdateService会让其AsyncTask下载文件并更新数据库。
用户可以随时选择查看更新页面,这是Activity(UpdateActivity)的扩展。调用UpdateActivity时,它会绑定到UpdateService。请记住,UpdateService仅在启动时(OnStartCommand())执行任何操作,而不是在绑定时(onBind())。
UpdateActivity实现了一个名为ProgressListener的自定义接口,它包含一个onProgressUpdate()方法。 UpdateService可以接受ProgressListener。
当UpdateActivity绑定到UpdateService时,会发生两件事。 1)UpdateActivity将自身的引用作为ProgressListener发送给UpdateService。 2)检查AsyncTask的状态。如果AsyncTask的状态为Status.RUNNING,则会为UpdateActivity的视图显示进度条。否则,可以看到一个按钮(“立即更新”)。单击该按钮也会使进度条可见并启动UpdateService(onStartCommand())。
AsyncTask在后台执行更新时,会调用publishProcess()将进度报告发送回UpdateService。如果注册了ProgressListener(UpdateActivity),则UpdateService会依次调用onProgressUpdate()将进度报告发送到该UpdateActivity,然后更新进度条。
用户可以随时进入和退出UpdateActivity,进度条将主要按预期显示。
我不知道这是否是实现此效果的最佳方式,但它现在对我有用。
感谢指针schwiz。
答案 1 :(得分:0)
我认为在这里调查服务会很好。也许您可以使用通知API来显示进度。在这种情况下,您甚至可能不需要第二项活动。用户点击更新按钮,现在通知栏有进度,如果用户退出应用程序,将继续运行。