清晰理解service

service的start和bind有什么区别?

start启动的service,service有独立的生命周期,不依赖该组件,多次调用startService,只会调用一次onCreate方法,但会多次调用onStartCommand方法。start启动的service,必须通过stopService(或者stopSelf)来停止服务。IntentService会自动调用stopSelf来停止服务.
bind启动的service,service依赖该组件,多次调用bindService,只会调用一次onBind方法。当组件销毁后,service也会随之销毁。

同一个service,先startService,然后bindService,如何把它停止掉?

不论startService调用几次,只要调用一次stopServie(或者stopSelf)就可以停止掉
bindService是区分connection对象的,绑定同一个connection对象,不管bind几次,只需要调用一次unbind,如果调用第二次就会发生运行时异常,service not registered。如果绑定的是不同的connection对象,调用n次bind,就需要调用n次unbind。
最后一次调用stopService或者unbind会导致service的onDestroy被调用。

你有注意到Service的onStartCommand方法的返回值么?不同的返回值有什么区别?

一共有以下四种返回值:

/*
*为了兼容版本(start_sticky),在service被杀死之后,并不保证onstartcommand会被再次调用
*/
public static int  START_STICKY_COMPATIBILITY = 0;
/*
*如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新
*创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。
*如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
*/
public static int  START_STICKY = 1;
/**
*非粘性的,使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启
*该服务。
*/
public static int  START_NOT_STICKY  = 2;
/*
*重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该
*服务,除非服务调用了stopSelf,并将被杀死前的Intent的值传入。
*/
public static int  START_REDELIVER_INTENT = 3;

Service的生命周期onCreate, onStartCommand,onBind运行在哪个线程?

生命周期都运行在主线程,所以在service中不能进行耗时操作,容易产生anr。如果想做耗时操作的话,必须另起线程,或者使用IntentService。

你可能感兴趣的:(清晰理解service)