显示IntentService的ProgressBar或Dialog以获取下载进度

时间:2013-11-28 12:24:58

标签: android progress-bar progressdialog download-manager

我有一个带有“下载”按钮的活动,它会激活在IntentService中实现的DownloadManager。一切都很好,我的问题是:

是否可以从我的DownloadService(扩展的IntentService)显示ProgressBar或ProgressDialog,但通知栏中显示的进度除外?

你能写一个示例代码或伪代码,我怎么能这样做?谢谢

1 个答案:

答案 0 :(得分:22)

  

是否可以显示我的ProgressBar或ProgressDialog   DownloadService(扩展的IntentService),进度除外   显示在通知栏中?

     

你能写一个示例代码或伪代码,我怎么能这样做?谢谢   你

您可以使用ResultReceiver来实现目标。 ResultReceiver实现了Parcelable,因此您可以将其传递给IntentService,如:

Intent i = new Intent(this, DownloadService.class);
i.putExtra("receiver", new DownReceiver(new Handler()));
<context>.startService(i);

然后在 onHandlerIntent()中,您需要的是获取传递给Intent的接收者并将当前进度发送到ResultReceiver中:

protected void onHandleIntent(Intent intent) {  

   // obtaining ResultReceiver from Intent that started this IntentService
   ResultReceiver receiver = intent.getParcelableExtra("receiver");

   ...

   // data that will be send into ResultReceiver
   Bundle data = new Bundle();
   data.putInt("progress", progress);

   // here you are sending progress into ResultReceiver located in your Activity
   receiver.send(Const.NEW_PROGRESS, data);
}

ResultReceiver 将处理数据,并将在 ProgressDialog 中进行更新。以下是ResultReceiver的实现(将其作为Activity类的内部类):

private class DownReceiver extends ResultReceiver {

   public DownloadReceiver(Handler handler) {
      super(handler);
   }

   @Override
   public void onReceiveResult(int resultCode, Bundle resultData) {
      super.onReceiveResult(resultCode, resultData);
      if (resultCode == Const.NEW_PROGRESS) {
         int progress = resultData.getInt("progress");

         // pd variable represents your ProgressDialog
         pd.setProgress(progress);
         pd.setMessage(String.valueOf(progress) + "% downloaded sucessfully.");
      }
   }
}