0

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

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

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

谁能在这里指出我正确的方向?提前致谢

4

2 回答 2

0

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

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

于 2013-03-22T19:40:37.923 回答
0

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

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

希望能帮助到你。

于 2016-03-12T22:37:50.840 回答