),每次客户端调用startService(Intent)方法启动Service时都会回调该方法。...从上图可以看出,每当Service被创建时会回调onCreate()方法,每次Service被启动时都会回调onStartCommand()方法;多次启动一个已有的Service不会再回调onCreate...()方法,但每次启动时都会回调onStartCommand()方法。...由于IntentService使用新的worker线程处理Intent请求,因此IntentService不会阻塞主线程,所以IntentService自己就可以处理耗时任务。...()方法,也就是每次启动该Service时都会执行onStartCommand()方法中的代码,更换壁纸的代码就放在该方法中。
必须要调用的unbindService(ServiceConnection)。 Q1:为什么我们一定要调用这个方法,如果我们不解绑会出现什么样的问题?...这也是为什么我们一直说需要解绑的原因。...另外看到了ServiceHandler中的stopSelf()方法,我们也就清楚了一个问题为什么我们不需要去控制IntentService的暂停。...START_NOT_STICKY:默认模式,这是一个容许被杀的模式,随时允许被叫停 START_REDELIVER_INTENT:告诉系统在崩溃后重新启动服务,并重新传递在崩溃时存在的意图。...好了,以上基本就是整个IntentService的介绍了,使用方法上来说应该也是比较简单了。
如果服务已在运行,则不会调用此方法,该方法只调用一次。 onStartCommand():当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。...onRebind():当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。...onStart() 或者 onStartCommand() 方法 特点: bind 的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。...IntentService是处理异步请求的一个类,在IntentService中有一个工作线程(HandlerThread)来处理耗时操作,启动IntentService的方式和普通的一样,不过当执行完任务之后...另外可以多次启动IntentService,每一个耗时操作都会以工作队列的形式在IntentService的onHandleIntent回调中执行,并且每次执行一个工作线程。
其实是不会的,因为IntentService真正执行异步任务的是HandlerThread+Handler,每次启动都会把下载图片的任务添加到依附的消息队列中,最后由HandlerThread+Handler...其实IntentService启动后还会去调用onStartCommand方法,而onStartCommand方法又会去调用onStart方法,我们看看它们的源码: @Override public void...(ServiceHandler本身就是一个异步处理的handler类),在onHandleIntent方法执行结束后,IntentService会通过 stopSelf(int startId)方法来尝试停止服务...最后我们要知道每次执行一个后台任务就必须启动一次IntentService,而IntentService内部则是通过消息的方式发送给HandlerThread的,然后由Handler中的Looper来处理消息...,而Looper是按顺序从消息队列中取任务的,也就是说IntentService的后台任务时顺序执行的,当有多个后台任务同时存在时,这些后台任务会按外部调用的顺序排队执行,我们前面的使用案例也很好说明了这点
实现原理 IntentService是Service的一个子类,使用工作线程来处理所有的启动请求,但是一次只能处理一个。...其内部使用HandleThread实现,每次请求都会在onStartCommand()里面向 ServiceHandler发送一个Message,在handleMessage内部调用onHandleIntent...随 后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。...使用这个返回值时,如果在执行完 onStartCommand 后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。...7、onRebind()什么时候被调用 首先前提是onUnbind()方法返回true,此前该服务的所有的绑定已经unBind(), 然后在新的客户端已连接到该服务时就会调用。 8、前台服务是什么?
stopSelf()方法才能让服务停止下来。...另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。 那么,用 IntentService 有什么好处呢?...为什么多次启动 IntentService 会顺序执行事件,停止服务后,后续的事件得不到执行?...中使用的 Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行
回调方法中依次执行,执行完自动结束 接下来,我们将通过 源码分析 解决以下问题: IntentService 如何单独开启1个新的工作线程 IntentService 如何通过onStartCommand...() 将Intent 传递给服务 & 依次插入到工作队列中 问题1:IntentService如何单独开启1个新的工作线程 主要分析内容 = IntentService源码中的 onCreate()方法...onStartCommand() 将Intent 传递给服务 & 依次插入到工作队列中 /** * onStartCommand()源码分析 * onHandleIntent() = 抽象方法...把 Intent参数 包装到 message 的 obj 发送消息中, //这里的Intent = 启动服务时startService(Intent) 里传入的 Intent msg.obj...()只会调用一次 = 只会创建1个工作线程; 当多次调用 startService(Intent)时(即 onStartCommand()也会调用多次),其实不会创建新的工作线程,只是把消息加入消息队列中
onHandleIntent() 方法 在处理完所有启动请求后自动停止服务,不需要我们调用 stopSelf() public void handleMessage(Message msg) {...仔细看下可以发现,这个 stopSelf() 方法传递了一个 id,这个 id 是启动服务时 IActivityManager 分配的 id,当我们调用 stopSelf(id) 方法结束服务时,IActivityManager...IntentService 的使用 通过前面的源码分析,我们可以看到,最终每个任务的处理都会调用 onHandleIntent(),因此使用 IntentService 也很简单,只需实现 onHandleIntent...在第一次启动 IntentService 后,IntentService 仍然可以接受新的请求,接受到的新的请求被放入了工作队列中,等待被串行执行。...使用 IntentService 显著简化了启动服务的实现,如果您决定还重写其他回调方法(如 onCreate()、onStartCommand() 或 onDestroy()),请确保调用超类实现,以便
源码分析 接下来,我们会通过源码分析解决以下问题: IntentService如何单独开启一个新的工作线程; IntentService如何通过onStartCommand()传递给服务intent被依次插入到工作队列中...问题1:IntentService如何单独开启一个新的工作线程 // IntentService源码中的 onCreate() 方法 @Override public void onCreate()...当多次调用 startService(Intent) 时(onStartCommand也会调用多次)其实并不会创建新的工作线程,只是把消息加入消息队列中等待执行,所以,多次启动 IntentService...,否则会引起ANR; IntentService:创建一个工作线程来处理多线程任务 Service需要主动调用stopSelft()来结束服务,而IntentService不需要(在所有intent...IntentService为Service的onStartCommand()方法提供了默认实现:将请求的intent添加到队列中 8.2 IntentService与其他线程的区别 IntentService
可以理解为 Service是不能直接处理耗时操作的,如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR;如果有耗时操作就必须开启一个单独的线程来处理。...IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作, 启动 IntentService 的方式和启动传统 Service...另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行, 并且,每次只会执行一个工作线程,执行完第一个再执行第二个...} /** * 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。...被调用"); super.onCreate(); } /** * 每次通过startService()方法启动Service时都会被回调。
bindService()方法绑定服务时,该方法将会被系统调用。 ...()onUnbind():当一个组件想通过bindService()方法绑定服务时,该方法将会被系统调用。 ()onCreate():当服务第一次被创建时,该方法将会被系统调用。...该方法在onStartCommand()或onBind()方法之前调用 ()onBind():这是一个必须实现的方法。当一个组件想通过bindService()方法绑定服务时,该方法将会被系统调用。...如果用户不允许绑定,那么只需要返回null ()onStartCommand():当组件通过StartService()方法请求服务启动时,该方法将被系统调用。...消息机制是一种实现进程间通信的最简单的方式,因为所有的请求都会放到一个消息队列当中去进行轮询处理(意思就是单线程啦),每次只处理一个服务请求,这样就不要保证你设计的service需要保证是线程安全状态的
不是已经有了Service,那为什么还要引入IntentService呢?...既然现象已经看了,我总结一下: Service与IntentService之间的区别 在这之前,需要知道Service的不足之处 a: Service不是专门的一条新的线程,因此不应该在Service中处理相当耗时的任务...a:IntentService会使用一个队列来关联Intent的请求,每当Activity请求启动IntentService时,IntentService会将该请求加入一个队列,然后开启一个新的线程去处理请求...所以IntentService不会把主线程卡死 b:IntentService会创建单独的线程处理onHandleIntent()方法里的实现代码 c:同时IntentService不用重写onBind..., OnStartCommand方法,只需实现onHandleIntent()方法 d:当所以的请求处理完后,Intent后自动停止服务,无需手动停止服务
activity 请求服务启动时,系统会调用这个方法。...如果只想提供绑定,不需要自己实现这个方法。 onBind() 当有其他组件想通过 bindService() 方法绑定这个服务时系统就会调用此方法。...继承IntentService 大多数服务不需要同时处理多个请求,继承IntentService是最好的选择 IntentService处理流程 创建默认的一个worker线程处理传递给onStartCommand...,如onCreate(),onStartCommand()等,一定要调用super()方法,保证IntentService正确处理worker线程,只有onHandleIntent()和onBind()...所以在服务里加代码是无法被调用的。处理这个情况的唯一方法是屏蔽掉force stop和uninstall按钮,让其不可用。方法自己去找吧。
返回值true表示希望以后再绑定时能够调用onRebind方法,false表示再绑定时不调用onRebind方法 最简单的服务启动顺序:onCreate->onStartCommand 最简单的服务退出顺序...2、绑定服务时,只调用onBind方法或者onRebind方法,不调用onStart和onStartCommand方法。...IntentService是Service的子类,它通过Looper和Thread来解决Service中处理逻辑的阻塞问题。...使用IntentService与Service的代码区别如下: 1、新的服务类从继承Service改为继承IntentService; 2、增加一个构造方法,为的是给内部线程分配唯一名称,示例代码如下...,把需要异步处理的代码写进去; 4、onStartCommand方法中记得调用父类的onStartCommand,因为Service类没有具体实现该方法但IntentService有具体实现,示例代码如下
一个Service可以被多个服务绑定,当它们都解绑时,服务被销毁 Service类中的重要方法 onStartCommand():当组件调用startService()时,系统调用该方法。...如果开发人员实现该方法,需要调用stopSelf()或stopService()来停止服务 onBind():当组件调用bindService()时,系统调用该方法。...可以实现如下任务: 创建区别于主线程的线程来执行发送到onStartCommand()方法的全部Intent 创建工作队列,每次传递一个Intent到onHandleIntent() 所有请求处理完毕后停止服务...也就是自动生成的return语句不能改 2.继承Service类 使用IntentService将简化启动服务的实现,但如果要处理多线程,则可以继承Service来处理各个Intent 对于每次启动的请求...bindService()方法,传递ServiceConnection实现 当系统调用ServiceConnection时,可以使用接口定义的方法回调服务 调用unbindService()方法解除绑定
同步与异步: 服务默认在主线程中运行,如果执行耗时操作,需要在服务内部创建新的线程来处理任务,以避免阻塞主线程。...在调用startService()时,系统会调用服务的onCreate()和onStartCommand()方法。 在Service中进行后台任务的处理或持续性工作。...在调用bindService()时,系统会调用服务的onBind()方法,返回一个实现了IBinder接口的对象,供调用方与服务进行通信。...onStartCommand():在每次通过startService()启动服务时调用,可执行后台任务或处理持续性工作。返回值用于定义服务的启动行为。...案例,通过startService()方法启动服务,并在onStartCommand()方法中处理任务。
这里我们以startService()为例分析,从我们启动一个IntentService,调用的过程大概是这样的, 构造方法 ->onCreate()- >onStartCommand()- >onStart...mName = name; } 其实很简单,只是调用父类的构造方法,并保存我们的那么字段 2)接着我们来看我们的onCreate方法做了什么?...()里面有调用onHandleIntent()去处理我们的Intent,这就是为什么我们需要重写onHandleIntent的原因。...我们知道多次调用context.startService方法,不会多次调用我们的onCreate()方法,但会调用我们的onStart()方法,而在我们的onStart()方法里面我们调用mServiceHandler.sendMessage...这个就很简单了,因为在处理完信息以后,会调用stopSelf去停止相应的服务。
() 方法实现的代码,无需处理多线程问题 所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service 为 Service 的 onBind...4.3.5 是一个基于消息的服务 每次启动该服务并不是马上处理你的工作,而是首先会创建对应的 Looper ,Handler 并且在 MessageQueue 中添加的附带客户 Intent 的 Message...() 方法实现的代码,无需处理多线程问题; 所有请求处理完成后,IntentService会自动停止,无需调用 stopSelf() 方法停止 Service ; 第五篇:Service 与...6.2.2 START_NOT_STICKY : “非粘性的”。 使用这个返回值时 , 如果在执行完 onStartCommand 后 , 服务被异常 kill 掉 ,系统不会自动重启该服务。...使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉 系统会自动重启该服务 , 并将 Intent 的值传入。
系统会尽快销毁服务。 绑定服务 当应用组件通过调用bindService()绑定到服务时,服务即处于绑定状态。...所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service; 为 Service的onBind() 提供默认实现,返回 null; 为 Service...使用这个返回值时,如果在执行完 onStartCommand 后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。...Service不是一条新的线程,因此不应该在Service中直接处理耗时的任务。 IntentService正好弥补了Service的不足。...IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无须处理多线程问题。
在这种情况下,当应用 C 发送隐式意图时,私有服务(A-1)调用失败。 另一方面,由于应用 A 可以通过隐式意图,按照预期成功调用应用内的私有服务,因此在安全性(恶意软件的对策)方面不会有任何问题。...它继承了Service类,并通过onStartCommand执行过程。 在用户方,服务由意图指定,并通过startService调用。...安全性检查应该由onStartCommand完成,但不能用于伙伴服务,因为无法获取来源的软件包名称。 IntentService类型 IntentService是通过继承Service创建的类。...调用方法与startService类型相同。 以下是与标准服务(startService类型)相比较的特征。 意图的处理由onHandleIntent完成(不使用onStartCommand)。...由于过程是由另一个线程执行的,因此调用会立即返回,并且面向意图的过程由队列系统顺序执行。 每个意图并不是并行处理的,但根据产品的要求,它也可以作为选项来选择,来简化实现。
领取专属 10元无门槛券
手把手带您无忧上云