Service 对于广大的Android开发者来说算是耳熟能详了,作为Android的四大组件之一,在我们的开发中也起着重要的作用,作为Android开发,或多或少都知道一些,但是不是每个人把所有知识点都了解的透测。本篇文章对Service的用法做一个总结,从Service的简介,Service的启动方式,Service的生命周期和IntentService四个方面来细说Service,并在文后罗列一些常见的面试题作为思考和回顾。
一、Service简介
引用官方定义:
Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。那么问题来了,既然它不使用用户界面,那么它怎么知道应该什么时候开始执行什么操作呢?答案是——它可以与其他的引用组件形成一些联系,从而可以根据其传来的信息在合适的时候执行合适的操作。
二、Service的启动方式
Service的启动方式主要有两种,分别是startService和bindService。其中,startService使用的是同一个Service,因此onStart()会执行多次,onCreate()只执行一次,onStartCommand()也会执行多次。使用bindService启动时,onCreate()与onBind()都只会调用一次。
使用startService启动时是单独开一个服务,与Activity没有任何关系,而bindService方式启动时,Service会和Activity进行绑定,当对应的activity销毁时,对应的Service也会销毁。
三、Service的生命周期
下图是startService和bindService两种方式启动Service的示意图:
Service的两种启动方式1、startService
onCreate():如果service没被创建过,调用startService()后会执行onCreate()回调;如果service已处于运行中,调用startService()不会执行onCreate()方法。
onStartCommand():多次执行了Context的startService()方法,那么Service的
onStartCommand()方法也会相应的多次调用。
onBind():Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。
onDestory():在销毁Service的时候该方法。
2、bindService
启动的服务和调用者之间是典型的Client-Server模式。调用者是client,Service则是Server端。Service只有一个,但绑定到Service上面的Client可以有一个或很多个。bindService启动服务的生命周期与其绑定的client息息相关。
1)首先,在Service的onBind()方法中返回IBinder类型的实例。
2)onBInd()方法返回的IBinder的实例需要能够返回Service实例本身
3、.Service 的 onStartCommand 方法返回值所代表的含义
1)START_NOT_STICKY
在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。
2)START_STICKY
重传 Intent。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异 常 kill 掉,系统会自动重启该服务 ,并且onStartCommand方法会执行,onStartCommand方法中的intent值为null。适用于媒体播放器或类似服务。
3)START_REDELIVER_INTEN
使用这个返回值时,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。适用于主动执行应该立即恢复的作业(例如下载文件)的服务。
四、IntentService
1、IntentService 是 Service 的子类,默认开启了一个工作线程HandlerThread,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务。只要实现一个方法 onHandleIntent,该方法会接收每个启动请求的 Intent,能够执行后台工作和耗时操作。可以启动IntentService 多次,而每一个耗时操作会以队列的方式在 IntentService 的 onHandlerIntent回调方法中执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个。并且等待所有消息都执行完后才终止服务。
2、IntentService原理
1)创建一个名叫 ServiceHandler 的内部 Handler
2)把内部Handler与HandlerThread所对应的子线程进行绑定
3)HandlerThread开启线程 创建自己的looper
4)通过 onStartCommand() intent,依次插入到工作队列中,并发送给 onHandleIntent()逐个处理可以用作后台下载任务 静默上传
3、与Service的区别
IntentService会创建独立的worker线程来处理所有的Intent请求 Service主线程不能处理耗时操作,IntentService不会阻塞UI线程,而普通Serveice会导致ANR异常。为Service的onBind()提供默认实现,返回null;onStartCommand提供默认实现,将请求Intent添加到队列中。所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service。
五、常见面试题
1、 Service的两种启动方式有何区别?
2、如何保证Service不被杀死?
3、Service 和 IntentService 的区别?
网友评论