Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用于上载/下载过程的bindservice与startService_Android_Multithreading_Service_Upload_Download - Fatal编程技术网

Android 用于上载/下载过程的bindservice与startService

Android 用于上载/下载过程的bindservice与startService,android,multithreading,service,upload,download,Android,Multithreading,Service,Upload,Download,我有一个问题,我应该使用哪种类型的服务来运行应用程序中的数据上传和下载 具体来说,绑定服务(通过调用bindService()获得)似乎更适用,因为我的后台工作并没有无限期地运行,我的理解是,这才是使用startService/START\u的真正目的 也就是说,我正在运行长时间的上传和下载,我不希望我的服务在上传/下载过程中被垃圾收集,不管应用程序的UI(发送到后台等)发生了什么。据我所知,如果我有一个绑定的服务,它将在所有连接解除绑定后立即被垃圾收集。这是否意味着我的绑定服务可能会中途停止

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

具体来说,绑定服务(通过调用bindService()获得)似乎更适用,因为我的后台工作并没有无限期地运行,我的理解是,这才是使用startService/START\u的真正目的

也就是说,我正在运行长时间的上传和下载,我不希望我的服务在上传/下载过程中被垃圾收集,不管应用程序的UI(发送到后台等)发生了什么。据我所知,如果我有一个绑定的服务,它将在所有连接解除绑定后立即被垃圾收集。这是否意味着我的绑定服务可能会中途停止


有人能给我指一下正确的方向吗?提前感谢

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

要使
服务
在前台运行,您需要给它一个
通知
。可以这样做:

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的一个非常基本的示例,但至少应该让您指向正确的方向。当您的操作完成后,您可以通过呼叫向系统发出信号,表示您可以自由地被收集。

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

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


希望能有所帮助。

我建议您通过
通知查看或制作
服务
。由于潜在的并发问题,我实际上无法使用IntentService。我希望使用这项服务的两个不同的事情,不只是上传和下载,我将需要这些操作中的一些不阻止对方。据我所知,发送到IntentServices的操作将始终连续运行?如果不是,那么这似乎是正确的解决方案。我的应用程序的后台进程有一个混合服务。它充当一个
IntentService
来安排某些数据同步操作,但它可以绑定以检索进度更新。我允许该服务在后台继续下载,但我故意没有使其持久化。我的理解是,为了防止服务被踢出,你需要有一个前台通知。我正在编辑我的评论以提供另一个选项。在前台运行服务将向系统发出信号,垃圾收集服务可能会中断用户。这可能是一个比IntentService更好的选择。我注意到你说背景工作不会无限期地进行。你介意我问一下上传/下载以及加载的频率吗?如果它们不是频繁的短任务,异步任务可能更适合您的需要。