2010-11-02 38 views
10

活动可以使用AsyncTask或Handler框架进行后台工作。即使用户已经离开开始他们的活动并且已经调用了该活动的onDestroy,两者仍将继续工作。换句话说,一个活动即使在GUI关闭后也完全可以做后台工作。为什么使用Service进行后台任务?

在这种情况下,使用服务进行后台工作似乎是冗余。服务将什么活动不能做到?谢谢。

回答

8

什么是服务?

有关服务类最混乱实际上都是围绕着它不是什么:

  • 服务没有单独的进程。服务对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它与它所属的应用程序在相同的过程中运行。
  • 服务不是线程。它不是一种自己的方式来处理主线程(以避免应用程序不响应错误)。

因此服务本身其实很简单,提供了两个主要特点:

  • 一种应用程序告诉系统有关的东西就是了设施在后台(用户即使做不直接与应用程序交互)。这对应于对Context.startService()的调用,它要求系统以计划工作为服务运行,直到服务或其他人明确停止它为止。
  • 应用程序的工具将其部分功能展示给其他应用程序。这与对Context.bindService()的调用相对应,该调用允许与服务进行长期连接以与其进行交互。

Read the rest of the documentation for more info

所以服务的一个实例是你想在自己设定的时间间隔发生的事情,而无需启动一个活动或者别的什么“推出”了。例如,SMSBackup只是一个在后台运行的服务,每隔X分钟轮询一次您的SMS消息并将它们复制到gmail标签中,作为“备份”服务。

+0

向其他应用程序公开非可视化功能是Service的合法使用。这不是问题。但是,计划后台工作是一个很好的用例,可能最好从服务中完成。 – Raj 2010-11-02 15:37:52

+0

您@BryanDenny表示我需要在服务类中启动一个新的thrad来执行网络或数据库操作?对?可能是这样的'线程的线程=新主题(){ @Override 公共 无效的run(){ 尝试{ 而(真){// 网络操作 } }赶上(InterruptedException的E){ Ë .printStackTrace(); } } }; thread.start();'或使用AsyncTask? – AlexSanchez 2013-03-21 02:04:08

+0

@BryanDenny [这是我的问题](http://stackoverflow.com/q/14760507/1067450)。一些帮助是受欢迎的。 – AlexSanchez 2013-03-21 03:29:54

0

当Activity显示的用户界面转到后台时(通过按Home键),并不能保证Activity长时间存在,框架可能会决定停止它。

+0

我认为有意义的是,没有被调用stopService(并因此onDestroy)的服务比被调用的onDestroy的活动更不太可能被杀死。 – Raj 2010-11-02 15:51:57

0

AsyncTask允许您轻松地执行UI更新,同时清楚地分离UI线程和工作线程逻辑。但是,其他应用程序将无法访问您的AsyncTask。在这种情况下,你需要这些服务。

0

@BraynDenny答案已经够好了,我想用另一个角度来解释。

首先,你误会了后台任务的意义,服务的定义说:服务不断在后台运行,即使应用程序是不是在前台,这里的长期背景,并不意味着独立的线程,这意味着该服务运行时,你关闭不像活动中的应用,也服务于主线程默认运行,如果你想有一个异步服务使用intentService

的活动是完全能够做到即使在其 GUI已关闭工作背景。

你说的是绝对错误的。 活动,服务是Android的的组成部分,但AsyncTasks或线程不会部件 当你杀死一个活动的AsyncTask的活动也被打死由于活动类中创建的AsyncTask的实例,但是当你开始下载使用前台服务文件,当你关闭的应用程序,就像在Android上的音乐应用程序,即使你关闭应用程序的音乐依然在后台播放,呈现出前景通知

有三个甚至没有被杀不同种类的服务,要了解更多关于他们的信息,请查看此链接https://developer.android.com/guide/components/services.html#CreatingBoundService