我有一个问题,我应该使用哪种类型的服务来运行在我的应用程序中上传和下载数据。
具体来说,似乎绑定服务(通过调用bindService()获得)实际上更适用,因为我的后台工作没有无限期运行,我的理解是这实际上是使用startService / START_STICKY的目的。
也就是说,我正在运行很长的上传和下载,并且我不希望通过上传/下载中途收集我的服务垃圾,无论应用程序的UI发生什么(发送)到背景等)。据我了解,如果我有一个绑定服务,一旦所有连接都被解除绑定,它将被垃圾收集。这是否意味着我的约束服务可能会在其正在进行的工作中途停止?
有人能指出我在正确的方向吗?提前致谢
答案 0 :(得分:0)
通过调用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
向系统发出信号,告知您可以自由收集。
答案 1 :(得分:0)
首先让我们回顾一下这项服务是什么。根据Android文档的服务是应用程序组件,表示应用程序希望在不与用户交互的情况下执行较长时间运行的操作。 当您使用startService()时,您将启动一个将在主线程上运行的服务,并且它没有连接到启动它的Activity,因此您无法与之通信。 当您使用bindService()时,您将服务绑定到活动,并且活动未被杀死时活动(设备调用或杀死onDestroy方法以释放内存)。
我的建议是你使用IntentService(搜索一个简短的教程),因为在这种情况下你可以向应用程序发送广播,它在不同的线程中运行,然后你可以在文件完成时收到通知上传。 您可以使用的另一种方法是使用JobScheduler(在Android 21上推出),以防您需要不断上传/下载文件(有点像Evernote在背景上每N分钟同步一次)。
希望它有所帮助。