【问题标题】:show ProgressBar or Dialog from an IntentService for download progress [closed]从 IntentService 显示 ProgressBar 或 Dialog 以获取下载进度 [关闭]
【发布时间】:2013-11-28 12:24:57
【问题描述】:

我有一个带有“下载”按钮的活动,该按钮启动在 IntentService 中实现的 DownloadManager。一切正常,我的问题是:

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

你能写一个示例代码或伪代码吗?谢谢

【问题讨论】:

  • 您可以使用异步任务来显示进度对话框,将下载服务放入 doinbackground() 并在预执行显示对话框和发布对话框取消对话框中。
  • @ShashankAgarwal 我应该澄清一下,我希望我的下载服务也可用于其他活动。你提议的方式我可以访问其他活动的下载服务吗?
  • “是否可以显示...除了通知栏中显示的进度?” - 可以。 “你能写一个示例代码或伪代码吗?” 不,我们不会为 Stackoverflow 上的人们编写代码。我建议您查看 android 开发者网站和/或在网上搜索示例。那里有很多。
  • 您可以将 asynctask 放在您希望下载服务的所有活动中。

标签: android progress-bar progressdialog download-manager


【解决方案1】:

是否可以从我的显示 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.");
      }
   }
}

【讨论】:

  • 投反对票的原因 投反对票先生?这很有效,因为我在我的项目中使用它。
  • OP 正在询问如何使用通知发布进度。这需要使用 RemoteViews。是什么让您认为 OP 从 Activity 启动 IntentService?例如,我从使用 AlarmManager 创建的警报或从 BroadcastReceiver 触发我的一个。在这两种情况下,ResultReceiver 都不合适。
  • @Squonk 你仔细阅读问题了吗? “是否可以从我的 DownloadService 中显示 ProgressBar 或 ProgressDialog(它是 IntentService 的扩展),除了通知栏中显示的进度?”
  • @Geralt 我会试试这个,谢谢。我在网上搜索了如何做到这一点,但找不到任何解释如何从 IntentService 做到这一点的东西。我想到的一个是将下载 ID 传递给一个弹出活动,该活动将处理进度条/对话框
  • @venta7 所以你有活动所以你所需要的就是创建代表 ResultReciever 的内部类。当您点击按钮时,您正在启动服务,在这里您将“附加”您的接收器到启动 IntentService 的 Intent 中,其他代码显示如何在 IntentService 中获取该接收器以及如何将进度发送回您的活动。
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多