Android面试——Service相关

今天介绍一下面试时被问到的关于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。

你可能感兴趣的:(android,面试,service,面试问题)