工作任务队列是顺序执行的。 如果一个任务正在IntentService中执行,此时你再发送一个新的任务请求,这个新的任务会一直等待直到前面一个任务执行完毕才开始执行 原因: 1....return null; } 在IntentService中,onBind()是默认返回null的,而采用bindService() 启动 IntentService的生命周期是:onCreate()...此时,你使用的是Service,而不是IntentService ---- 7....,否则会引起ANR; IntentService:创建一个工作线程来处理多线程任务 Service需要主动调用stopSelft()来结束服务,而IntentService不需要(在所有intent...有兴趣可以继续关注Carson_Ho的安卓开发笔记 ---- 请帮顶或点赞评论!
第三篇:Service 与 Thread ---- 3.1 Service 和 Thread 的区别 3.1.1 首先第一点定义上 thread 是程序执行的最小单元,他是分配 cpu 的基本单位安卓系统中...而 service 大家记住,它是安卓中的一种特殊机制,service 是运行在主线程当中的,所以说它不能做耗时操作,它是由系统进程托管,其实 service 也是一种轻量级的 IPC 通信,因为 activity...3.1.2 第二点是在实际开发的过程当中 在安卓系统当中,线程一般指的是工作线程,就是后台线程,做一些耗时操作的线程,而主线程是一种特殊的线程,它只是负责处理一些 UI 线程的绘制,UI 线程里面绝对不能做耗时操作...(这是 Thread 在实际开发过程当中的应用) 而 service 是安卓当中,四大组件之一,一般情况下也是运行在主线程当中,因此 service 也是不可以做耗时操作的,否则系统会报 ANR 异常(...区别 4.3.1 Service 是用于后台服务的 当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了 Service 这个概念 那么这里面要强调的是:Service 不是独立的进程
Service的使用 Service的创建和Activity类似,也是通过Intent来实现的,既然是安卓四大组件之一,那么它也需要在清单文件中进行注册的。具体步骤如下。...而Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。这就会让人对这两个概念产生混淆了。 Service和Thread到底有什么关系呢?...IntentService IntentService的概念 IntentService是Android中的一个系统封装类,继承自四大组件之一的Service,主要用于处理异步请求,实现多线程,它有以下特点...创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。...IntentService的创建 编写自己的Service类继承IntentService,并重写其中的onHandleIntent(Intent)方法,该方法是IntentService的一个抽象方法
IntentService与Service的区别(intentservice的优点) IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁...Service和Thread的区别 Service是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时操作。...使用IntentService IntentService 是 Scrvice 的子类,因此它不是普通的 Service,它比普通的Service 增加了额外的功能。...Service不是一条新的线程,因此不应该在Service中直接处理耗时的任务。 IntentService正好弥补了Service的不足。...IntentService还有个好处就是 「用完即走」。执行完onHandleIntent()方法里面的耗时操作后,自行调用onDestroy()方法,进行关闭。 Android入门教程视频参考
源码分析 IntentService的源码工作流程如下: 特别注意:若启动IntentService 多次,那么 每个耗时操作 则 以队列的方式 在 IntentService的 onHandleIntent...工作任务队列 = 顺序执行 即 若一个任务正在IntentService中执行,此时你再发送1个新的任务请求,这个新的任务会一直等待直到前面一个任务执行完毕后才开始执行 原因: 由于onCreate...()只会调用一次 = 只会创建1个工作线程; 当多次调用 startService(Intent)时(即 onStartCommand()也会调用多次),其实不会创建新的工作线程,只是把消息加入消息队列中...() 即,并不会调用onStart() 或 onStartcommand(),故不会将消息发送到消息队列,那么onHandleIntent()将不会回调,即无法实现多线程的操作 此时,你应该使用Service...,而不是IntentService 8.
,然后去下载图片,注意即使我们多次启动IntentService,但IntentService的实例只有一个,这跟传统的Service是一样的,最终IntentService会去调用onHandleIntent...其实IntentService启动后还会去调用onStartCommand方法,而onStartCommand方法又会去调用onStart方法,我们看看它们的源码: @Override public void...这里采用stopSelf(int startId)而不是stopSelf()来停止服务,是因为stopSelf()会立即停止服务,而stopSelf(int startId)会等待所有消息都处理完后才终止服务...的onHandleIntent方法是一个抽象方法,所以我们在创建IntentService时必须实现该方法,通过上面一系列的分析可知,onHandleIntent方法也是一个异步方法。...,而Looper是按顺序从消息队列中取任务的,也就是说IntentService的后台任务时顺序执行的,当有多个后台任务同时存在时,这些后台任务会按外部调用的顺序排队执行,我们前面的使用案例也很好说明了这点
IntentService的Demo程序 IntentService常被用于处理异步任务,使用的步骤是,先继承IntentService,再在handleIntent方法里写业务逻辑。...Demo的运行情况就讲到这里,下面我们通过源码,来揭开IntentService的神秘面纱。 源码分析 IntentService继承于Service,是一个抽象类。...代码量不太多,只有180行左右,所以读起来也不是特别复杂。...ServiceHandler mServiceHandler; ServiceHandler 是IntentService的内部类,继承于Handler。...onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); // 执行完后就停止服务 } 从这里调用到了onHandleIntent
IntentService是什么? 这篇文章是之前就写好的,一直没有整理出来,这几天有空正好整理发布一下。...而IntentService就是解决这个问题的,它是Service的一个抽象子类,需要实现onHandleIntent,代码在这个函数中执行。...它与Service最大的不同就是默认开启一个子线程,而onHandleIntent就是在子线程中执行的。 所以IntentService就是一个自带子线程的Service。...((Intent)msg.obj); stopSelf(msg.arg1); } } 复制代码 可以看到在handleMessage中调用了onHandleIntent,这样函数中的代码就在这个...上面我们说过stopSelf会试图停止服务,为什么是试图而不是一定,关键就是startId这里。
┋ 使用AIDL(Android interface definition language 安卓接口定义语言)。...前面说过message采用的是AIDL的架构基础的,当我们需要同时处理多个请求,而不是放在队列里面一个一个的处理的时候就可以采用这种方式了。...以下对intentservice描述错误的是 您的回答为:intentservice本质是一种特殊的Service,继承自Service是一个最终类。 ...()即使我们多次启动IntentService,但IntentService的实例只有一个,这跟传统的Service是一样的,最终IntentService会去调用onHandleIntent执行异步任务...()创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。
IntentService有以下特点: (1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。...(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。 (3) 不需要主动调用stopSelft()来结束服务。...(4) 默认实现的onBind()返回null (5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中 继承IntentService的类至少要实现两个函数:构造函数和...要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数。...super.onDestroy(); } @Override protected void onHandleIntent(Intent arg0) {
服务应该实现这个方法来清理诸如线程,注册的监听器等资源。这是最后调用的方法。 安卓系统只会在内存占用很高,必须恢复系统资源供当前运行程序的情况下强制停掉一个运行中的服务。...关闭则由服务自己的方法stopSelf()或者由启动服务的地方调用stopService(Intent)方法来关闭。并不会因为启动服务的应用程序销毁而关闭。 ...继承IntentService 大多数服务不需要同时处理多个请求,继承IntentService是最好的选择 IntentService处理流程 创建默认的一个worker线程处理传递给onStartCommand...这些都加入到IntentService中了,你需要做的就是实现构造方法和onHandleIntent(),如下: public class HelloIntentService extends IntentService...onBind(Intent intent) { // TODO Auto-generated method stub return myBinderB; } } 启动前台服务 前台服务是被认为是用户已知的正在运行的服务
官方文档关于它的介绍: IntentService 使用工作线程逐一处理所有启动请求。如果你不需要在 Service 中执行并发任务,IntentService 是最好的选择。...(msg.arg1); } 有同学可能有疑问,在 handleMessage 方法中不是调用了一次 onHandleIntent() 后就调用 stopSelf() 了吗,这不是只能执行一个任务么?...此外还要注意的是,IntentService 中除了 onHandleIntent 方法其他都是运行在主线程的。...IntentService 的使用 通过前面的源码分析,我们可以看到,最终每个任务的处理都会调用 onHandleIntent(),因此使用 IntentService 也很简单,只需实现 onHandleIntent...使用 IntentService 显著简化了启动服务的实现,如果您决定还重写其他回调方法(如 onCreate()、onStartCommand() 或 onDestroy()),请确保调用超类实现,以便
大家好,又见面了,我是你们的朋友全栈君。 IntentService浅析 说起IntentService就需要先了解一下Service。 Service 是长期运行在后台的应用程序组件。...IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service...另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...或 Messenger 使得 IntentService 和 Activity 可以通信,这样那么 onHandleIntent() 不会被回调,相当于在你使用 Service 而不是 IntentService...IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行,而如果服务停止,会清除消息队列中的消息,后续的事件得不到执行。
IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作, 启动 IntentService 的方式和启动传统 Service...另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行, 并且,每次只会执行一个工作线程,执行完第一个再执行第二个...PS:每一个安卓应用都会启动一个进程,然后进程会启动一个Dalvik虚拟机,即,每个Android应用进程对应着一个独立的Dalvik虚拟机实例,然后启动的应用程序再在虚拟机上被解释执行(dalvik虚拟机...c 有一个正在调用生命周期的回调函数的service(如onCreate()、onStar()、onDestroy()) d 它有一个正在运行onReceive()方法的广播接收对象。...Android把进程里优先级最高的activity或服务,作为这个进程的优先级。例如,一个进程拥有一个服务和一个可见的activity,那么这个进程将会被定义为可见进程,而不是服务进程。
IntentService的分析和用法,实用性介绍。...IntentService 简介 IntentService继承自Service,可用startService启动,也需要在AndroidManifest.xml中注册 IntentService在一个单独的...intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; // 这个是停止服务的依据...在ServiceHandler中每次处理完一个命令都会调用stopSelf(int startId)方法来停止服务。 IntentService直到命令队列中的所有命令被执行完后才会停止服务。...最新StartId=4 [CalIntentService] onDestroy. StartId=4 可以看出,先执行onStart,然后排队执行onHandleIntent。
如果这是正在主线程执行onStartCommand(),则必须要等onStartCommand()的内容执行完,才依次执行onDestroy()的内容。...如果这时后台线程onHandleIntent( )正在执行,onDestroy( )不会自动将后台线程停止,后台线程继续运行,我们必须在onDestroy()的代码中终结后台线程的运行。...(); super.onDestroy(); } //检查返回HTTP Response的返回值,如果是3xx-6xx,不是2xx,则说明出错,例如404...注意,终止服务是终止整个服务,会触发服务中的onDestroy( ),如果队列中还有其他命令等等服务处理,将由onDestroy()中的代码停止。...因此影响的是所有正在和等待服务处理,而不单是客户端的请求,此需特别注意!!
在开发安卓应用的过程中,我们经常需要这样的场景:希望APP在不影响当前用户的操作的前提下,在后台默默的做一些任务。比如:静默的下载文件或者上传数据。我们一般会考虑到新启一个线程去做异步的操作。...IntentService会在任务执行完成后自行结束自己,而不需要外部去调用stopService了。 . 2.正确使用的姿势 优点我们已经知道了,那该如何正确的使用呢?...因为只有handleMessage方法调用后才会调用onHandleIntent方法去处理任务。那么IntentService在哪里去调用Handler的handleMessage方法的呢?...我们都知道bindService启动的生命周期是不会回调onStart的生命周期的,所以onHandleIntent的异步处理方法也不会回调。...onHandleIntent根本不会调用,和启动一个普通的Service没两样。 综上,我们应该使用startService的方式启动IntentService。
(而普通thread执行完run方法中的耗时操作就结束了。)当不使用时 如onDestroy中,使用quit()或quitSafely()退出即可。...IntentService是继承自Service的抽象类,可执行后台耗时任务,执行完后会自动停止。...//但如果此时外部又调用了startService,那么最新的请求id就不是msg.arg1了,所以下面这句就不会结束service。...所以IntentService 的子类必须要重写onHandleIntent,并处理这个intent。...然后不间断连续启动3次,由日志可见是顺序执行的,最后都执行完才走到onDestroy。
前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentService...使用步骤 步骤1:定义 IntentService的子类,需复写onHandleIntent()方法 步骤2:在Manifest.xml中注册服务 步骤3:在Activity中开启Service服务...实例讲解 步骤1:定义 IntentService的子类 传入线程名称、复写onHandleIntent()方法 public class myIntentService extends IntentService...{ /** * 在构造函数中传入线程名字 **/ public myIntentService() { // 调用父类的构造函数 /...对比 此处主要讲解IntentService与四大组件Service、普通线程的区别。 6.1 与Service的区别 ? 6.2 与其他线程的区别 ? ---- 7.
Service标签时,必须配置intent-filter子节点,并指定action子节点 AIDL Android interface definition language安卓接口定义语言 作用:跨进程通信...activity(onResume调用)的进程 拥有一个与正在和用户交互的activity绑定的服务的进程 拥有一个正在“运行于前台”的服务——服务的startForeground方法调用 拥有一个正在执行以下三个生命周期方法中任意一个的服务...但是服务的系统优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服务。如果你希望服务可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台服务。...而 Alarm机制则不存在这种情况,它具有唤醒 CPU的功能,即可以保证每次需要执行定时任务的时候 CPU都能正常工作。 需要注意, 这里唤醒 CPU和唤醒屏幕完全不是同一个概念,千万不要产生混淆。...//3.根据IntentService的特性,这个服务在运行结束后应该是会自动停止的,所以重写onDestroy()方法,在这里也打印了一行日志,以证实服务是不是停止掉了。
领取专属 10元无门槛券
手把手带您无忧上云