【问题标题】:bindservice vs startService for upload/download processesbindservice vs startService 用于上传/下载过程
【发布时间】:2013-03-12 18:26:14
【问题描述】:

我有一个关于我应该使用哪种类型的服务来在我的应用程序中运行数据上传和下载的问题。

具体来说,似乎绑定服务(通过调用 bindService() 获得)确实更适用,因为我的后台工作不会无限期地运行,我的理解是这确实是使用 startService/START_STICKY 的目的。

也就是说,我正在运行长时间的上传和下载,并且我确实希望在上传/下载过程中收集我的服务垃圾,无论应用程序的 UI 发生了什么(发送到背景等)。据我了解,如果我有一个绑定服务,一旦所有连接都解除绑定,它就会被垃圾收集。这是否意味着我的绑定服务可能会在它正在执行的操作中途停止?

任何人都可以在这里指出正确的方向吗?在此先感谢

【问题讨论】:

  • 我建议查看IntentService 或将Service run in the foreground 设为Notification
  • 由于潜在的并发问题,我实际上无法使用 IntentService。我希望将这项服务用于一些不同的事情,而不仅仅是上传和下载,而且我需要其中一些操作来避免互相阻塞。据我了解,发送到 IntentServices 的操作将始终串行运行?如果不是,那么这似乎是正确的解决方案。
  • 我为我的应用程序的后台进程提供了混合服务。它充当IntentService 来安排某些数据同步操作,但可以绑定以检索进度更新。我允许服务在后台继续下载,但我故意没有让它持久化。据我了解,要防止服务被踢出,您需要启动前台通知。
  • 我正在编辑我的评论以提供另一种选择。使服务在前台运行将向系统发出信号,表明垃圾收集您的服务可能会对用户造成干扰。这可能是比 IntentService 更好的选择。
  • 我注意到您说后台工作不会无限期地进行。你介意我问一下上传/下载和加载的频率是多少吗?如果它们是不常见的短任务,AsyncTask 可能更适合您的需求。

标签: android multithreading service upload download


【解决方案1】:

通过调用startForeground 使您的Service 在前台运行将向系统发出信号,表明您的服务的终止和/或垃圾收集将对用户造成干扰。这将阻止系统清理您的服务,除非由于系统资源不足或电力不足而必须这样做。

要让Service 在前台运行,您需要给它一个Notification。可以这样做:

Notification.Builder builder = new Notification.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.notification_icon);
builder.setContentTitle("Your notification text");
builder.setProgress(100, 0, true); /* 0 out of 100 progress to start */
builder.setAutoCancel(false);
builder.setOngoing(true);
Notification notification = builder.getNotification();

/* NOTIFICATION_ID can just be a static int to identify your service's notification */
startForeground(NOTIFICATION_ID, notification);

这是一个使用 startForeground 的非常基本的示例,但至少应该让您指向正确的方向。操作完成后,您可以致电stopForeground 向系统发出信号,表明您可以被收集。

【讨论】:

    【解决方案2】:

    首先让我们回顾一下什么是服务。根据 Android 文档,服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行更长时间运行的操作。 当您使用 startService() 时,您将启动将在主线程上运行的服务,并且它未连接到启动它的 Activity,因此您无法与它通信。 当您使用 bindService() 时,您将服务绑定到 Activity,并且它在 Activity 未被终止时处于活动状态(设备调用或终止的 onDestroy 方法以释放内存)。

    我的建议是您使用 IntentService(搜索简短教程),因为在这种情况下,您可以向应用程序发送广播,它在不同的线程中运行,然后您可以在文件完成时收到通知上传。 您可以使用的另一种方法是使用 JobScheduler(在 Android 21 上推出),以防您需要不断上传/下载文件(有点像 Evernote 在后台每 N 分钟同步一次)。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2014-07-22
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多