Android 安卓服务的确切用途是什么?

Android 安卓服务的确切用途是什么?,android,Android,对于长时间运行的任务,在应用程序中使用Thread而不是Android服务的缺点是什么。如果我不在长时间运行的任务中使用Android服务,会发生什么?什么都不会发生,我在一个异步任务中运行了一个算法大约90小时。很好 异步任务:将“繁重”任务从UI中分离出来,例如下载 服务:将任务与应用程序分离,例如闹钟 是一个可以执行以下操作的应用程序组件 后台长时间运行的操作,不提供用户 接口。另一个应用程序组件可以启动一个服务并将其删除 将继续在后台运行,即使用户切换到 另一个应用程序。此外,组件可以绑

对于长时间运行的任务,在应用程序中使用Thread而不是Android服务的缺点是什么。如果我不在长时间运行的任务中使用Android服务,会发生什么?

什么都不会发生,我在一个异步任务中运行了一个算法大约90小时。很好

异步任务:将“繁重”任务从UI中分离出来,例如下载 服务:将任务与应用程序分离,例如闹钟
  • 是一个可以执行以下操作的应用程序组件 后台长时间运行的操作,不提供用户 接口。另一个应用程序组件可以启动一个服务并将其删除 将继续在后台运行,即使用户切换到 另一个应用程序。此外,组件可以绑定到服务 与之交互,甚至执行进程间通信 (IPC)。例如,一个服务可以处理网络事务 音乐、执行文件I/O或与内容提供商交互,所有这些 从背景来看

  • 另一方面,是任何多任务处理的基石 操作系统,可以被认为是运行的小型进程 在主流程中,其目的是至少使 应用程序中并行执行路径的外观


  • 它们将按照要求使用,我们无法实际指出它们的优点和缺点,因为它们在不同的情况下都是必不可少的。

    服务:

    服务是
    在后台运行的组件,不与用户直接交互。由于服务没有用户界面,因此它未绑定到活动的生命周期

    服务用于重复和潜在的长时间运行操作
    ,如互联网下载、检查新数据、数据处理、更新内容提供商等

    可以为服务分配与前台活动相同的优先级。在这种情况下,需要为相关服务激活一个可见的通知。它经常用于播放视频或音乐的服务

    线程:

    它们是简单的可运行线程。您可以使用这些线程执行非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更新。如果您完全不需要,请不要使用线程和处理程序,因为您可能会遇到许多并发/死锁等问题。