Service是什么?
Service作为Android四大组件之一,Service是可以在后台执行长时间任务而没有用户界面的应用组件。
Service和Thread的区别
Thread是程序运行的最小单元——线程。
Service是安卓的一种机制,运行在主线程,因此在Service中进行耗时操作也需要开启新的线程。
那为什么还要Service不在Activity中直接操作Thread呢?
因为activity很难对Thread进行管理,当activity销毁了,之后的activity就没办法获取到之前创建的Thread。
StartService步骤
1、定义一个类继承于Service
2、在Manifest.xml文件中配置该Service
3、使用Context的startService(Intent)方法启动该Service
4、不再使用时使用stopService(Intent)方法停止该服务
BindService步骤
1、定义一个类继承Service,创建一个继承与Binder的实例对象,并提供公共方法供客户端调用。
2、实现onBind()方法,返回Binder实例
3、在Manifest.xml文件中配置该Service
4、在客户端中,实现ServiceConnection实例,从onServiceConnected()回调方法接收Binder,并使用bindService绑定服务。注:onServiceDiscounnection方法是在服务崩溃或者服务杀死导致的连接中断时调用
Service的生命周期
startService和bindService回调的生命周期是不一样的。
在startService中:
首先会回调onCreate,再调用onStartCommand,最后在setopSelf或者Activity中调用stopService(Intent)方法时,会调用onDestroy方法。
onCreate:首次创建服务时,系统会调用此方法来执行一次性设置程序,该方法在onBind和onStartCommand方法之前,如果服务已经在运行则不会再调用词方法,总的来说,该方法只会在Service创建时,调用一次。
onStartCommand:每次通过startService(Intent)方法启动Service时都会调用。其中我们可以注意onStartCommand是有返回值的,其中返回值包括:START_STICKY、START_NOT_STICKY、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。
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后一定能重启。
OnDestroy:在Service销毁时调用,可在此回收一些资源。
在bindService中:
首先会调用onCreate,然后调用onBind方法,然后在Activity与Service解绑时调用Unbind方法,最后在所有Activity与Service解绑后,该Service会销毁,并调用onDestroy方法。
onBind:绑定服务才会调用,但注意即使我们用startService也要实现该方法。