我正在寻找一个例子,说明使用IntentService
可以做到的事情,而使用Service
则无法做到(反之亦然)?
我还了解到,IntentService
在不同的线程中运行,而Service
则不会。因此,据我所知,在其自己的线程中启动服务就像启动IntentService
一样。这是正确的吗?
我正在寻找一个例子,说明使用IntentService
可以做到的事情,而使用Service
则无法做到(反之亦然)?
我还了解到,IntentService
在不同的线程中运行,而Service
则不会。因此,据我所知,在其自己的线程中启动服务就像启动IntentService
一样。这是正确的吗?
Tejas Lagvankar写了一篇很好的关于这个主题的文章。
何时使用?
Service可用于没有UI的任务,但不应太长。如果需要执行长时间的任务,必须在Service中使用线程。
IntentService通常用于长时间的任务且不与主线程通信。如果需要通信,则可以使用Main Thread handler或broadcast intents。另一个使用情况是需要回调(Intent触发的任务)。
如何触发?
通过调用方法startService()来触发服务。
IntentService使用Intent触发,它会生成一个新的工作线程,并在该线程上调用方法onHandleIntent()。
触发自
- 服务和IntentService可以从任何线程,活动或其他应用程序组件触发。
运行在
服务在后台运行,但在应用程序的主线程上运行。
IntentService在单独的工作线程上运行。
限制/缺点
服务可能会阻塞应用程序的主线程。
IntentService无法并行运行任务。因此,所有连续的意图将进入工作线程的消息队列中,并按顺序执行。
何时停止?
如果您实现了一个服务,当其工作完成时,调用stopSelf()
或stopService()
停止服务是您的责任。(如果您只想提供绑定,则不需要实现此方法)。
IntentService会在处理完所有启动请求后停止服务,因此您永远不需要调用stopSelf()
。
Service
是一个对象,它不在任何线程上运行。Service
的方法可以在任何线程上运行,而生命周期方法(onCreate()
、onStartCommand()
、onDestroy()
)由 Android 框架在主(UI)线程上调用。实现 Service
时,通常会启动自己的工作线程或后台线程,并在这些线程上执行长时间运行的操作。IntentService
只是 Service
的扩展,为您完成其中一些操作。 - David Wasser如果有人可以给我展示一个只能使用
IntentService
而不能用Service
完成的示例,或者反过来。
根据定义,这是不可能的。 IntentService
是用Java编写的Service
子类。因此,IntentService
做的任何事情,Service
都可以通过包含IntentService
使用的相关代码来完成。
使用自己的线程启动服务就像启动IntentService。 是吗?
IntentService
的三个主要特点是:
后台线程
将传递到onStartCommand()
的Intent
自动排队处理,因此如果一个Intent
正在由后台线程的onHandleIntent()
处理,其他命令会排队等待轮流执行
当队列为空时,通过调用stopSelf()
自动关闭IntentService
所有这些都可以在不扩展IntentService
的情况下通过Service
实现。
startService
调用的Service
只能运行约10秒钟就会抛出ANR错误。然而,通过广播一个Intent启动的IntentService
似乎没有这个限制。 - edthethirdonHandleIntent
而不是onStartCommand
中进行工作--看起来onStartCommand
在UI线程上运行,然而,在执行onHandleIntent
时会产生一个单独的线程。 - edthethirdIntentService
会在onHandleIntent()
返回后自己调用。 - CommonsWare服务
startService()
调用。线程
触发。主线程
上运行。stopSelf()
或stopService()
来停止服务。IntentService
Handler
或BroadcastReceiver
完成。Intent
调用。主线程
触发。startService
调用。请相应地编辑您的答案并使其连贯。 - daparicIntentService 扩展了 Service 类,这意味着 IntentService
是有意为之的同样的目的。
那么目的是什么呢?
`IntentService` 的目的是使我们更轻松地运行后台任务,甚至不必担心以下问题:
创建工作线程
按顺序排队处理多个请求(Threading
)
Service
所以不需要,Service
可以执行IntentService
执行的任何任务。如果您的要求符合上述标准,则不必在 Service
类中编写这些逻辑。
Service 运行在 UI 线程上,而 IntentService 运行在单独的线程上
当您想要依次执行多个存在于 Activity 范围之外的后台任务时,IntentService
是完美的选择。
IntentService
是如何由 Service
创建而来的普通服务运行在 UI 线程上(任何 Android 组件类型都默认在 UI 线程上运行,例如 Activity
、BroadcastReceiver
、ContentProvider
和Service
)。如果您需要执行一些可能需要一段时间才能完成的工作,则必须创建一个线程。在多个请求的情况下,您将不得不处理同步
。
IntentService
已经给你提供了一些默认的实现,可以为你完成这些任务。根据开发者页面的说明:
IntentService
创建一个工作线程
IntentService
创建了一个工作队列,按顺序将请求发送到onHandleIntent()
方法中
当没有任务时,IntentService
调用stopSelf()
方法
为onBind()
方法提供了默认实现,该实现为空
onStartCommand()
的默认实现会将Intent
请求发送到工作队列,并最终到达onHandleIntent()
为已接受的答案添加积分:
查看Android API中IntentService的用法。 例如:
public class SimpleWakefulService extends IntentService {
public SimpleWakefulService() {
super("SimpleWakefulService");
}
@Override
protected void onHandleIntent(Intent intent) { ...}
@Override
public int More ...onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
**
Volley库
有一个名为Volley库的库,用于开发Android网络应用程序。 该源代码可在GitHub上公开获取。
我相信你可以通过简单地搜索“Android IntentService vs Service”之类的东西,找到一个广泛的差异列表。
举个例子,其中一个更重要的区别是,IntentService在完成任务后会自行关闭。
一些快速编造的例子:
IntentService:如果您想在打开应用程序时下载大量图像。这是一次性过程,可以在所有内容下载完成后进行清理。
Service:一个服务,将不断用于通过Web API调用在您的应用程序和后端之间进行通信。即使它已经完成了当前的任务,您仍然希望它在几分钟后继续存在,以进行更多的通信。
IntentService
运行在自己的线程上。当它完成时,会自动停止。更像是一次性启动而不需要等待任务完成。
后续调用将被排队。适合排队调用。如果需要的话,您还可以在 IntentService
中旋转多个线程- 可以使用 ThreadPoolExecutor
来实现这一点。
我之所以这样说,是因为很多人问我“为什么使用 IntentService
因为它不支持并行执行”。
IntentService
只是一个线程。您可以在其中执行任何需要的操作- 甚至可以旋转多个线程。唯一的注意事项是,IntentService
会在您旋转这些多个线程时立即结束。它不等待这些线程返回。因此,在这种情况下,建议使用 ThreadPoolExecutor
。
默认情况下,Service
在主线程上运行。您需要旋转工作线程来完成您的任务。
您需要显式停止 service
。
我在需要在后台运行任务时,例如 Headless service
的情况下使用了它。
如果需要的话,您始终可以使用 BroadcastReceivers
与您的活动进行通信。
Android IntentService vs Service
1. Service(服务)
2. IntentService(意图服务)
参考来源:这里
IntentService
可以做到而service
做不到的事情的示例,以及反过来。
IntentService
不能用于长时间监听,例如XMPP监听器,它只是一个一次性运算符,完成工作后就会结束。