今天介绍一下面试时被问到的关于Service的问题。
一、什么是Service以及它的生命周期
Service是Android组件的一种,派生自android.app.service类。它不提供交互界面,只是在后台运行,进行功能调度或提供数据支持。可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。 需要通过某一个Activity或者Context对象来调用。Service组件主要有两个作用:后台运行和跨进程访问。
Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期 方法也不同。
非 绑 定 模 式 : 当 第 一 次 调 用 startService 的 时 候 执 行 的 方 法 依 次 为 onCreate() 、 onStartCommand(),当 Service 关闭的时候调用onDestory 方法。
绑定模式:第一次 bindService()的时候,执行的方法为 onCreate()、onBind()解除绑定的 时候会执行 onUnbind()、onDestory()。
上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意Service 实例只会有一个,也就是说如果当前要启动的Service 已经存在了那么就不会再次创建该 Service 当然 也不会调用 onCreate()方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该 Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户 都执行了unBind()该 Service 也不会销毁。
二、StartService与bindService之间的区别?
StartService启动了Service之后无法与Activity之间进行通信,与现有的Activity分离,即使Activity被杀掉了之后,Service还可以运行,同时通过设置Service的粘性,还可以让Service被杀掉之后,可以自启动。
而bindService启动Service之后,与绑定的Activity之间有关系,可以依据Server/Client模式来进行通信(binder客户端主动请求模式,或者通过信使),但是无法设置Serrvice的粘性。
StartService启动的Service,Activity中可以调用stopService()方法来结束一个Service,或者通过Service自己调用stopSelf()方法来结束Service。
- 而bindService只能通过Activity()来调用unbindService()方法来结束Service,Service会调用onUnBind()方法,以及onDestroy()方法。
三、IntentService与Service有什么区别?
IntentService是Service的子类
Service如果要处理异步请求(如耗时操作)的话,需要自己启动一个worker thread,如果启动多个worker thread来处理相关事务的话,各线程之间无法很好的控制。
而IntentService可以将多个异步请求的Intent放入队列中,封装了一个开启worker thread的onHandleIntent()方法,来依次处理放入队列中的Intent,只有一个worker thread在运行,同一时刻只有一个Intent被处理,当一个Intent处理完了之后才会处理另外一个Intent。
Service可以通过startService()或者bindService()方法来启动,而IntentService则是通过startService()方法来启动。
- Service适合多线程处理异步请求。而IntentService则适合处理需要排队的请求。
四、Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
默认情况,如果没有显示的指 servic所运行的进程, Service 和 activity 是运行在当前 app 所在进 程的 main thread(UI主线程)里面。
service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ) 特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行
五、Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service进行绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了 Service 提供的服务代理对象。
在Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取 Service 的服务对象那么肯定需要通过 bindService()方法,比如音乐播放器,第三方支付等。如 果仅仅只是为了开启一个后台任务那么可以使用startService()方法。
六、Android中Service和Thread有什么区别,为什么有时候放着方便的Thread不用,而要使用Service呢?
Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
Service是Android的四大组件之一,被用来执行长时间的后台任务。默认情况下Service是运行在主线程中的。
区别
Service是的四大组件之一,被用来执行长时间的后台任务。默认情况下Service是运行在主线程中的。
service可以在android系统后台独立运行,线程是不可以。
.Service类是可以供其他应用程序来调用,而Thread只是在本类中在使用,如果本类关闭那么这个thread也就下岗了而Service类则不会。
如果需要执行复杂耗时的操作,必须在Service中再创建一个Thread来执行任务。Service的优先级高于后台挂起的Activity,当然也高于Activity所创建的Thread,因此,系统可能在内存不足的时候优先杀死后台的Activity或者Thread,而不会轻易杀死Service组件,即使被迫杀死Service,也会在资源可用时重启被杀死的Service。