我能否更新处于后台的活动的用户界面?

7
这个问题更多是概念性的,而不是与编码相关的。
我有一个包含Activity A和B的应用程序。
我从Activity A调用了一个AsyncTask,在调用过程中,我不想阻塞用户,所以我显示了进度对话框,这样我的用户可以自由地在应用程序中移动,而不会感到无聊等待。
现在,查询是从Activity A调用AsyncTask或者说Service,负责从服务器下载某种数据。当调用正在进行时,用户已经更改了Activity并且Activity A已经转到后台。
现在,当用户自由地在应用程序中移动时,他只想回到Activity A来检查下载状态(假设我将一些数据设置为TextView)。
现在的问题是,一旦下载完成,即使Activity A仍处于后台,我的UI也应该更新。这样用户感觉在切换到Activity A之前就获得了数据。
如果可以的话,如何实现呢?总结我的问题,我能否使用Activity调用的Asynctask或Service更新Activity在后台时的UI。
有一篇帖子建议我最好在onResume()中更新UI。我的问题是,这是唯一的方法吗?
2个回答

2

onResume() 是最好的方法。您可以将更改保存在SharedPreferenes中,或通过Intent传递数据,并在UI可见之前显示更改。

另一种方法是运行服务并检查活动是否可见。如果它可见,立即更新UI,否则等待用户访问该活动。要检查活动当前是否可见,请参见此处,

如何检查活动是否在前台或可见的后台?


你可以将更改保存在SharedPreferenes中,或者使用Intent传递数据,并在UI可见之前显示更改。获取数据并存储数据不是问题,问题是如何在UI不可见的情况下填充UI,你知道任何回调方法吗? - akash89
到目前为止,直接尝试更新UI而不可见是一种不好的做法,可能会导致应用程序崩溃。您也可以使用onSaveInstanceState()来保存状态。 - Prokash Sarkar
onResume在onCreate之前被调用了?!http://developer.android.com/reference/android/app/Activity.html - MikeL

2
下载完成后,即使我的Activity A仍处于后台,也应该在Activity A仍然在后台时更新UI。这样用户会感觉在切换到Activity A之前就已经获取了数据。
很抱歉,这是不可能的。您需要知道,Activity必须通过onCreate()和onResume()回调来更改UI。
另外,当Activity返回前台时,您应该使用绑定服务来更新Activity。请参考绑定服务

简单总结一下你的方法,我从服务/异步任务中获取数据,而活动在后台运行(但是我不能像你建议的那样更新UI),所以它会像这样:我有数据,应用程序等待用户将Activity A带到前台,一旦发生这种情况,如果更新的数据很大,那么用户将逐渐看到UI被填充,而不是感觉他得到了一个已经填充好的UI?我的理解正确吗? - akash89
谢谢...我想我会接受它。 - akash89
我不明白为什么在后台运行的活动无法更新。一个活动可以被置于后台但并未被销毁(用户按下Home键将应用程序置于后台)。在这种情况下,后台活动仍然可以通过后台线程或任务进行更新。 - Kai
@Kai:根据我的了解,你所建议的做法是不可能的,最重要的原因是Android明确禁止在另一个线程上执行UI操作。你可以尝试并查看你的方法是否可行。如果你证明它是可行的,我会很高兴被证明是错误的。 - Yash Sampat
我并没有说UI更新将在工作线程中完成。相反,工作线程可以调用Handler.post()方法,在UI线程中为后台活动更新UI。 - Kai
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接