本文重点
Service的start和bind状态有什么区别?
同一个Service,先startService,然后在bindService,如何把它停止掉?
Service的onStartCommand方法的返回值及其区别?
Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
1.Service的start和bind状态有什么区别
-
启动:
多次调用startService():onCreate()方法只会调用一次,onStartCommand()会多次调用;
多次调用bindService():onCreate()方法只会调用一次,onBind()方法只会执行一次; -
解绑:
startService()无论调用多少次,对stopService()方法或者stopSelf方法()的单个调用都会停止该服务;
unbindService()方法的调用解绑unbindService()方法
2.同一个Service,先startService,然后在bindService,如何把它停止掉?
Service的真正销毁是在调用onDestroy()方法之后,在销毁服务之前需要对已经启动的服务进行解绑(并不需要考虑顺序)
3.Service的onStartCommand方法的返回值及其区别?
/**
* 为了兼容版本,在Service被kill后,并不保证onStartCommand
* 方法会被再一次调用
*/
public static final int START_STICKY_COMPATIBILITY = 0;
/**
* service被kill后,保留启动状态,但不保存intent,之后系统会尝试
* 重启该service,并重新回调onStartCommand。如果没有其他start命令。Intent为null。
* 因此需要对onStartCommand方法中的intent值判空
*/
public static final int START_STICKY = 1;
/**
* 常规操作。如果在执行完onStartCommand方法后,服务被异常kill掉,系统不会自动重启该服务。
*/
public static final int START_NOT_STICKY = 2;
/**
* service被kill后,系统会组织一次service重启(除非那之前调用了stopSelf方法),被杀死前
* 最后一次传递的intent将重新执行,该flag不会传递空intent。
*/
public static final int START_REDELIVER_INTENT = 3;
这里简单总结一下
START_STICKY:服务明确需要管理并长期运行;不需要记住服务被杀死时的状态;example:播放音乐。
START_NOT_STICKY:服务明确不需要管理;服务定期运行并自行停止;example:闹钟服务或者服务器数据轮询。
START_REDELIVER_INTENT:服务明确需要管理;重新获取服务被杀死前的状态;example:文件下载。
Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
Service默认是在主线程中运行。如果Service要做CPU密集型或阻塞操作,它应该在子线程中完成操作(IntentService类有自己的线程,可以完成耗时的操作)。否则会产生ANR.
网友评论