我的用例是(大致)首次启动时的以下内容:
活动开始服务
service获取并保存数据库中的数据
服务通过意图通知活动
活动显示数据
现在我想在服务繁忙时显示进度条.问题是:
startService(new Intent(getApplicationContext(), UpdateDataService.class));
需要很长时间才能"返回"UI线程.它似乎是一个同步函数(或不?).如果清空服务类,则几乎立即处理startService命令.似乎UI线程等待Serice处理它的工作,这根本没有意义.我尝试启动(尽管看起来很愚蠢)在我的UI线程中显示进度条时启动服务异步任务.奇怪的是,这有时会起作用.Othertimes我只是在我的服务正在工作时获得一个白色屏幕,之后是一毫秒ma进度条然后我的UI.
现在我的问题是:如何在不阻止我的UI的情况下启动服务?
public class MyClass extends TabActivity {
private ProgressDialog pd;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = null;
//building some tabs here, setting some text views....
// starting service if does not exist yet
boolean serviceRunning = false;
final ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (final RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("aegir.mobile.UpdateDataService".equals(service.service.getClassName())) {
serviceRunning = true;
Log.i(MY_APP_TAG, "Service found.");
}
}
if (!serviceRunning) {
pd = ProgressDialog.show(this, "Loading...", "Setting up data.", true, false);
new StartServiceAsync().execute("");
}
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(final Message msg) {
pd.dismiss();
}
};
public class StartServiceAsync extends AsyncTask {
@Override
protected String doInBackground(final String... params) {
// starting service
startService(new Intent(getApplicationContext(), UpdateDataService.class));
return null;
}
@Override
protected void onPostExecute(final String result) {
handler.sendEmptyMessage(0);
super.onPostExecute(result);
}
}