1、Service的start和bind状态有什么区别?
区别:(1)生命周期不同 startService:onCreate->onStartCommand->onStart 再次start:onStartCommand->onStart stop:onDestory。 bindService:onCreate->onBind 再次bind:不会再执行onBind unbind:onUnBind->onDestory
(2)是否自动销毁 1.start 启动状态的服务不会自动随启动组件销毁而自动销毁 2.bind 绑定状态的服务当启动组件销毁后会自动调用onUnbind和onDestory方法 (3)应用场景不同(使用而言) 1.start方式使得Service处理启动状态,适用于做后台计算(若耗时需子线程), 与启动组件无交互,相互独立。 2.bind方式使得Service可跟启动组件交互,双方进行通讯。
2、同一个Service,先startService,然后再bindService,如何把它停止掉?
stopService和stopSelf都可以停止startService()方式启动的service, 调用unbindService可解绑bindService()方式启动的service。 先停止服务还是先解绑服务的顺序是无所谓的,两者都调用了才能停止掉它。 据官方文档可知:若被停止的服务依然有ServiceConnection 与其绑定,则服务不能销毁, 直至我们把所有ServiceConnection 解绑。若所有ServiceConnection 解绑后,系统会自动销毁服务, 但有使用startService()启动的情况,我们不得不再调用一次stopService来销毁它。
3、你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?
onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中, 系统应该如何继续这个服务的值(虽然你能够修改这个值,但是IntentService处理还是为你提供了 默认实现)。 onStartCommand()方法有三种返回值:
STARTSTICKY(常量值:1):sticky的意思是“粘性的”。使用这个返回值时,我们启动的服务跟 应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。 当再次启动服务时,传入的第一个参数将为null;
STARTNOTSTICKY(常量值:2):“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后, 服务被异常kill掉,系统不会自动重启该服务。
START
REDELIVER_INTENT(常量值:3):重传Intent。使用这个返回值时,如果在执行完 onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4、Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
默认情况,如果没有显示的指 service 所运行的进程, Service运行在当前 app 所在进程的 mainthread(UI 主线程)里面,也就是Service的生命周期方法都运行在主线程。 但是,若在清单文件指定了android:process=":remote",则运行在其他进程中, 这种远程服务用在公共的服务上,例如:天气预报、友盟之类的推送服务等。