Android 安卓服务的确切用途是什么?
对于长时间运行的任务,在应用程序中使用Thread而不是Android服务的缺点是什么。如果我不在长时间运行的任务中使用Android服务,会发生什么?什么都不会发生,我在一个异步任务中运行了一个算法大约90小时。很好 异步任务:将“繁重”任务从UI中分离出来,例如下载 服务:将任务与应用程序分离,例如闹钟Android 安卓服务的确切用途是什么?,android,Android,对于长时间运行的任务,在应用程序中使用Thread而不是Android服务的缺点是什么。如果我不在长时间运行的任务中使用Android服务,会发生什么?什么都不会发生,我在一个异步任务中运行了一个算法大约90小时。很好 异步任务:将“繁重”任务从UI中分离出来,例如下载 服务:将任务与应用程序分离,例如闹钟 是一个可以执行以下操作的应用程序组件 后台长时间运行的操作,不提供用户 接口。另一个应用程序组件可以启动一个服务并将其删除 将继续在后台运行,即使用户切换到 另一个应用程序。此外,组件可以绑
它们将按照要求使用,我们无法实际指出它们的优点和缺点,因为它们在不同的情况下都是必不可少的。服务: 服务是
在后台运行的组件,不与用户直接交互。由于服务没有用户界面,因此它未绑定到活动的生命周期
服务用于重复和潜在的长时间运行操作
,如互联网下载、检查新数据、数据处理、更新内容提供商等
可以为服务分配与前台活动相同的优先级。在这种情况下,需要为相关服务激活一个可见的通知。它经常用于播放视频或音乐的服务
线程:
它们是简单的可运行线程。您可以使用这些线程执行非UI任务,但不能在其中执行UI任务(因为UI不是线程安全的)。要在这些线程中处理UI,您必须使用处理程序
,这对于初学者掌握和理解它们是相当麻烦的
因此,根据您的需求和应用程序,您可以选择最适合您的应用程序
如果我不在长时间运行的任务中使用Android服务,会发生什么
您可能会幸运地完成代码。同样,您可能不会幸运,您的代码会在随机时间点被杀死。
除了教科书中关于什么是安卓服务
和什么是线程
的描述之外,这两者之间的主要区别与您的问题直接相关,就是操作系统如何威胁它们
线程是一种在后台执行代码的方法,而服务是一种让Android意识到你在后台执行代码的方法
就底层Linux内核而言,它只知道线程,只关心线程切换和优先级。是否有服务对此没有影响
然而,就安卓设备内存管理和任务优先级而言,安卓不知道或不关心进程中的线程。它只知道服务,并且只在主应用程序进程线程上与服务交互
因此,只要有一个线程处于活动状态,内核就会很高兴地尝试保持进程处于活动状态,并为该线程的执行分配CPU时间
但是,除非您的活动、服务、内容提供商或广播接收器处于活动状态,否则Android内存管理器可能会决定杀死您的进程,以便为另一个更高优先级的进程回收其资源,而不管此时哪些线程正在工作
因此,如果用户与您的活动交互,您可以在单独的线程上运行东西,但如果您希望确保后台任务成功完成并且不会在随机点中断,则需要将其包装到服务中(最好是由活动绑定的,或通过显示通知提升到UI优先级的)
请注意,拥有一个服务并不能保证其代码将在后台运行。Android将调用生命周期方法(onStartCommand/onBind/onCreate/OnDestroy)在应用程序进程的主线程上。您的代码必须启动一个线程,以确保真正的后台执行。强烈建议在Android中使用服务来执行前台和后台任务。我强烈建议您查看Android中的IntentService类,而不是详细介绍定义。可从API级别3获得该类为您的后台任务执行大部分工作线程繁重的工作。该类处理表示为意图的异步请求。客户端使用startService(意图)发送请求调用。服务会根据需要启动,使用工作线程依次处理每个意图,并在工作结束时停止。最酷的事情是,您可以将其与AlarmManager实现一起使用,每10-15分钟说明一次您想要做的事情,并且仍然不必担心线程和处理程序显式实现,因为如果需要,您必须这样做您使用服务类
下面是一小段关于如何实现它的代码
public class UpdateService extends IntentService {
public UpdateService() {
//constructor
}
@Override
public void onCreate() {
super.onCreate();
//Called by the system when the service is first created.
}
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStart(intent, startId);
return(START_REDELIVER_INTENT); //Intent Relidelivery
//You should not override this method for your
IntentService and remember onStart() for IntentService is
deprecated.
}
@Override
protected void onHandleIntent(Intent intent) {
//do your main background tasks here forget about threading doing anything
in here Android will do the heavylifting as required
}
@Override
public void onDestroy() {
super.onDestroy();
//finalize your objects GC etc here
//Called by the system to notify a Service that it is no longer
used and is being removed.
}
}
服务是长时间运行任务的最佳实现,您不需要立即进行用户输入或ui更新。如果您完全不需要,请不要使用线程和处理程序,因为您可能会遇到许多并发/死锁等问题。