Service相关面试题

1、service 的生命周期,两种启动方式的区别

  • startService
    Service的生命周期:onCreate() --> onStart() -> onDestroy()
    停止服务:service.stopService()
  • bindService
    Service的生命周期 onCreate() --> onBind() --> onUnBind() --> onDestroy()
    停止服务:UnbindService()再StopService()

当app执行 Process.killProcess(Android.os.Process.myPid()) ; System.exet(0): 的时候系统会重启service,针对不同版本的系统。有的系统会执行context.startService 而有的会执行context.bindService,两者唯一的相同点就是都会重启service。

使用startService()方法启用服务,调用者与服务之间没有关联,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只能先UnbindService,再StopService,所以是先start还是先bind行为是有区别的。
 
 如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
  
  如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。

2、Service启动流程

四大组件-Service

3、Service与Activity怎么实现通信

  1. Activity绑定Service并调用Service中的方法
    这是最简单最常用的方法,Activity通过Intent向服务发送消息并绑定,同时通过IBinder拿到Service的引用调用其公开的方法。
  2. Service向Activity发送消息
    Service想向Activity发送信息,因为Activity已经拿到Service的引用,而它们又是在一个进程中,所以可以使用监听器模式,当Service完成某工作通知Activity。(然而,Service若是开了工作线程,还得使用Handler与其通信或者直接使用AsyncTask)
  3. Activity和Service的跨进程双向通信机制
    对于不同进程中的Activity和Service(我觉得同一公司的不同应用之间用的比较多),要实现IPC(跨进程通信),其实也是通过IBinder接口,其中可能涉及到AIDL编程,和操作系统提供的进程通信接口这些底层c++知识。然而,Google已经为我们封装了一套Messenger机制,其底层也是使用AIDL实现的。要使用这套机制,必须为通信双方建立各自的Messenger,然后Service的Messenger依然是通过IBinder传递到Activity,Activity也可以将自己的Messenger通过Message的replyTo属性传递到Service。

4、IntentService是什么,IntentService原理,应用场景及其与Service的区别

IntentService

5、Service 的 onStartCommand 方法有几种返回值?各代表什么意思?

有四种:

  • START_STICKY
    粘性的
    表示:如果service被杀死之后,service会保留开始的状态,但是不会保留之前传递过来的intent对象
  • START_NOT_STICKY
    非粘性的
    表示:service 被杀死之后,系统不会自动重启该service
  • START_REDELIVER_INTENT
    重传intent
    表示:service 被杀死之后,系统会自动重启该服务,并且保留之前的intent传入
    就是比START_STICKY 多了一个intent
  • START_STICKY_COMPATIBILITY
    START_STICKY的兼容版本,但是不保证service一定能重启

6、bindService和startService混合使用的生命周期以及怎么关闭

  1. startService启动方式过程及生命周期:
    onCreate()–> onStartCommand()/onStart() —> onDestory();
    1)创建服务onCreate()在整个生命周期仅执行一次,每次调用服务都会执行onStart()或onStartCommand();
    2)停止服务onDestory()在整个生命周期仅执行一次;
    3)服务一旦启动,生命周期将不受限于UI线程。应用(Activity)终止,服务仍然在后台运行;
    4)直接启动的服务,其它应用不能调用其中的功能。
  2. bindService绑定方式过程及生命周期:
    onCreate() —> onBind() —> onUnbind() –> onDestory();
    1)创建服务onCreate()在整个生命周期仅执行一次;
    2)每次调用服务必须首先bindService/onBind,执行unbindService/onUnbind后不能调用;
    3)服务的生命周期受限于UI线程。一旦应用(Activity)终止,服务将onDestory销毁;
    4)可以在绑定后调用服务里的功能。
  • 如果先bindService,再startService:
    在bind的Activity退出的时候,Service会执行unBind方法而不执行onDestory方法,因为有startService方法调用过,所以Activity与Service解除绑定后会有一个与调用者没有关连的Service存在。
  • 如果先bindService,再startService,再调用Context.stopService:
    Service的onDestory方法不会立刻执行,因为有一个与Service绑定的Activity,但是在Activity退出的时候,会执行onDestory,如果要立刻执行stopService,就得先解除绑定。
  • 先startService,再bindService。
    首先在主界面创建时,startService(intent)启动方式开启服务,保证服务长期后台运行;
    然后调用服务时,bindService(intent, connection, BIND_AUTO_CREATE)绑定方式绑定服务,这样可以调用服务的方法;调用服务功能结束后,unbindService(connection)解除绑定服务,置空中介对象;最后不再需要服务时,stopService(intent)终止服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值