如何在android中显示服务进度

时间:2010-07-27 21:19:35

标签: android service android-activity

在我的Android应用程序中,我使用选项卡视图,因此我有两个选项卡:参数和结果。

用户在第一个选项卡上输入各种参数,然后切换到第二个选项卡以查看结果。

我有一项服务可以执行一些长时间运行的计算。用户在第一个选项卡上输入参数并点击“计算”。他们可以进行调整并点击“重新计算”,并使用新参数更新服务。

随着这些计算的进展,我希望用户能够切换到结果选项卡以查看最新计算的结果。然后,他们将查看结果,并能够切换回参数选项卡进行调整。

我可以想到两种方法:

- 使用服务注册“结果标签”,当服务到达里程碑时,它会直接调用“结果标签”。

- 在“结果选项卡”中运行一个计时器,让它定期查询绑定服务并进行相应更新。

人们对这两种方法有意见或建议吗?

2 个答案:

答案 0 :(得分:1)

AsyncTask有一个publishProgress方法,可以让你将后台任务的更新推送到UI线程真的很轻松。

答案 1 :(得分:0)

使用广播接收器

public class Detail extends GDActivity {

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(DownloadService.CUSTOM_INTENT)) {
                mProgressDialog.setProgress(intent.getFlags());
            }
        }
    };

    // Flag if receiver is registered 
    private boolean mReceiversRegistered = false;
    // Define a handler and a broadcast receiver
    private final Handler mHandler = new Handler();

    @Override
    protected void onResume() {
      super.onResume();

      // Register Sync Recievers
      IntentFilter intentToReceiveFilter = new IntentFilter();
      intentToReceiveFilter.addAction(DownloadService.CUSTOM_INTENT);
      this.registerReceiver(mIntentReceiver, intentToReceiveFilter, null, mHandler);
      mReceiversRegistered = true;
    }

    @Override
    public void onPause() {
      super.onPause();

      // Make sure you unregister your receivers when you pause your activity
      if(mReceiversRegistered) {
        unregisterReceiver(mIntentReceiver);
        mReceiversRegistered = false;
      }
    }
}
}

和发件人

  @Override
    protected void onProgressUpdate(Integer... progress) {
        Intent i = new Intent();
        i.setAction(CUSTOM_INTENT);
        i.setFlags(progress[0]);
        ctx.sendBroadcast(i);
    }