Service自动被销毁?

1 简介

Service的几种应用场景中,你是否考虑过Service是否真正被销毁了?本篇将针对各种场景下,Service如何被自动销毁以及重建做个简单的介绍。

2 使用场景

2.1 同一应用内使用Service

  • 使用startService启动服务

1.直接关闭应用,用户通过back键返回关闭应用时,应用可能并没有真正意义的退出,当点击任务栏快捷键查看时该应用可能还存在,这种情况下应用并没有完全退出,所以Service没有被销毁

2.直接关闭应用,应用确实被杀死了。通过任务栏,查看应用列表,已无该应用。这种情况下需要参考onStartCommand的返回参数,来判断Servcie的状态。

onStartComand使用时,返回的是一个(int)整形。

这个整形可以有四个返回值:START_STICKY、START_NO_STUCKY、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY

它们的含义分别是:

1):START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务

3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

  • 使用bindService绑定服务
    应用退出以后,service会自动被销毁。
  • 使用startServcie启动服务,然后使用bindService绑定服务
    应用退出后,如果onStartCommand返回的是粘性服务,Service会被重建,且onStartCommand会被执行,即Service会正常运行;如果返回非粘性服务,Servcie会被重建,但是onStartCommand并不会被执行,即Service被重建,但是并没有在运行状态
  • 使用bindService绑定服务,然后使用startService启动服务
    该种场景与第三种场景一样。

2.2 不同应用之间使用Service

  • 使用startService启动服务
    关闭服务所在应用的情况可以参考同一应用中的情况;关闭启动服务的进程,对service无影响,故不会销毁服务。
  • 使用bindService绑定服务
    需要多个客户端都与service断开连接才会销毁服务。
  • 使用startServcie启动服务,然后使用bindService绑定服务
    1)关闭服务所在应用的情况:
    如果onStartComand,返回的是粘性服务,客户端退出以后,服务会被重建且onBind,conStartCommand会被重新执行;如果返回的是非粘性服务,服务会被重建,onBind方法会重新执行。
    2)关闭启动服务者的进程:
    如果使用startService启动的,服务不会被销毁;
    如果使用bindService绑定服务的,多个客户端如果全部退出,服务会被解绑;否则,对服务没有影响。
  • 使用bindService绑定服务,然后使用startService启动服务
    可以参考第三种场景。

你可能感兴趣的:(四大组件,Android笔记,service自动销毁,service杀不死,service)