1.Service的start和bind状态有什么区别?
1.service的startSerive(前提serive属于四大组件必须在清单文件注册)启动了onCreate(),onStartCommand(),但无论start多少次,onCreate只会初始化一次,后面startSerive只会重复调用onStartCommand。 bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);要实例化一个serviceConnection,bindService后的onCreate和bind只会实例化一次。
2、同一个Service,先startService,然后再bindService,如何把它停止掉?
2.假如一个service先startService再bindSerivice,1)直接先stopService,因为service还别的有客户端bind,所以还有个“已绑定”状态,所以不会被销毁,所以不会执行onDestroy方法;然后再unbind,此时已经没有任何状态了,所以会被销毁,会调用onUnbind和onDestroy方法。2)先unbind:因为service是别的客户端通过start启动的,所以还有个“已启动”状态,所以不会被销毁,所以只执行onUnbind方法;再stop,此时已经没有任何状态了,所以会被销毁,调用onDestroy方法。所以正确的做法是应该最后必须解绑service(unbindservice)和停止服务(stopservice)。
3、你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?
3.onstartCommand有四个返回值START_STICKY_COMPATIBILITY, START_STICKY, START_NOT_STICKY or START_REDELIVER_INTENT。
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
4、Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
4.service通过打log 。Looper.myLooper() == Looper.getMainLooper()判断。知道oncreate,onstartcommand,onbind都在主线程