Service面试详解

一、service基础

1、Service是什么?

是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。

2、Service和Thread的区别

service运行在主线程中,四大组件之一。Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。而在service中就可以实现多个Activity控制同一个线程。

3、终止Thread的方法

有三种方法可以结束线程:

1.使用退出标志,使线程正常退出,也就是当run方法完成后线程终止


2.使用interrupt()方法中断线程

3.使用stop方法强行终止线程(不推荐使用,可能发生不可预料的结果)


二、Service启动方式


1、startService

2、bindService


3、onStartCommand(Intent intent, int flags, int startId)

intent :启动时,启动组件传递过来的Intent,如Activity可利用Intent封装所需要的参数并传递给Service

flags:表示启动请求时是否有额外数据,可选值有0,START_FLAG_REDELIVERY,START_FLAG_RETRY,0代表没有,它们具体含义如下:

START_FLAG_REDELIVERY

这个值代表了onStartCommand方法的返回值为

START_REDELIVER_INTENT,而且在上一次服务被杀死前会去调用stopSelf方法停止服务。其中START_REDELIVER_INTENT意味着当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand(),此时Intent时有值的。

START_FLAG_RETRY

该flag代表当onStartCommand调用后一直没有返回值时,会尝试重新去调用onStartCommand()。

startId : 指明当前服务的唯一ID,与stopSelfResult (int startId)配合使用,stopSelfResult 可以更安全地根据ID停止服务。


实际上onStartCommand的返回值int类型才是最最值得注意的,它有三种可选值,START_STICKY,START_NOT_STICKY,START_REDELIVER_INTENT,它们具体含义如下:

START_STICKY

当Service因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand方法,但其中的Intent将是null,除非有挂起的Intent,如pendingintent,这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似服务。

START_NOT_STICKY

当Service因内存不足而被系统kill后,即使系统内存再次空闲时,系统也不会尝试重新创建此Service。除非程序中再次调用startService启动此Service,这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务。

START_REDELIVER_INTENT

当Service因内存不足而被系统kill后,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand(),任何挂起 Intent均依次传递。与START_STICKY不同的是,其中的传递的Intent将是非空,是最后一次调用startService中的intent。这个值适用于主动执行应该立即恢复的作业(例如下载文件)的服务。

由于每次启动服务(调用startService)时,onStartCommand方法都会被调用,因此我们可以通过该方法使用Intent给Service传递所需要的参数,然后在onStartCommand方法中处理的事件,最后根据需求选择不同的Flag返回值,以达到对程序更友好的控制。好~,以上便是Service在启动状态下的分析,接着我们在来看看绑定状态的Service又是如何处理的?

你可能感兴趣的:(Service面试详解)