我有一个后台服务,每天在交易中做一些繁重的工作。如果用户此时正好启动应用程序,我希望他们坐下来直到完成(大约10秒左右)。在所有活动中,最好的方法是什么?检查服务是否在每个活动的“onResume”功能中运行?我们怎么知道它何时完成?当地的广播,我猜...
最佳实践?
更新:我设法停止“onResume”直到我的服务完成。问题是用户在此之前只看到一个空白屏幕。我在onResume暂停时尝试了progressdialogs和常规对话框。但它们只有在onResume返回时才会显示,并且会破坏目的。换句话说,在调用“show()”之后,“进度”对话框不会立即“显示”:(
答案 0 :(得分:2)
我会在数据库中有一个' 我正在忙着处理 '标志。
应用程序应检查启动,然后以一种很好的方式锁定应用程序,然后检查说每隔x秒查看标志的状态。它可以在正常处理期间执行此操作,因此每个操作都会在本地和服务器上检查此标志,然后再启动。
似乎是一种简单的锁定方式。因此,您可能需要考虑争用(多个用户设置和取消设置)可能使用信号量类型的安排。
答案 1 :(得分:1)
本地广播很好。
让您的活动在服务繁忙时对其进行质询,并在完成活动之前向用户显示相应的消息。
服务完成后,让它发送一个已完成的意图。
答案 2 :(得分:0)
在您的服务中使用 AsyncTask 来执行繁重的数据库工作。
并使用共享首选项保存标志,以通知正在进行工作的其他活动。当flag为true表示正在进行中,当flag为false时表示已完成工作。
执行以下操作:
private class DatabaseWork extends AsyncTask<String, Integer, Long> {
protected void onPreExecute ()
{
//Set SharedPref flag = trueto notify other activities that work has been started.
}
protected Long doInBackground(URL... urls) {
//Your database work
return false;
}
protected void onProgressUpdate(Integer... progress) {
//if you want to show progress to user
}
protected void onPostExecute(Long result) {
//after complete your work set SharedPref flag = false to notify other activities that work has been finished.
}
}
现在,您可以检查onCreate或onResume事件上的每个活动的SharedPref标志值。如果您找到了true,那么您可以显示一个进度对话框,告诉用户等待。
答案 3 :(得分:0)
我找到的最好的方法是创建一个&#34;加载活动&#34;它总是首先加载,并在安全的情况下将用户发送到主屏幕。