「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
Service的两种存在状态
启动状态
Context.startService()方式启动
Context.startService()方式的生命周期:
启动时,startService –> onCreate() –> onStart()(可多次调用) ,Service running,停止时,stopService –> onDestroy()
在Service未被创建并运行时,则android先调用onCreate(),然后调用onStart()。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
同上,如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()。如果是调用者自己(即启动服务的应用或活动)直接退出而没有调用stopService的话,Service会一直在后台运行 Context.startService()方法启动服务,该Service的调用者再启动起来后可以通过stopService关闭Service。
服务可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,只要调用一次stopService()方法便可以停止服务,无论调用了多少次的启动服务方法。
绑定状态
Context.bindService()方式启动
Context.bindService()方式的生命周期:
绑定时,bindService -> onCreate() –> onBind()(只一次,不可多次绑定)->onServiceConnected,Service running, 调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()
Context.bindService()方式启动 Service的方法:
绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);
第一个:Intent对象
第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接
第三个:如何创建Service,一般指定绑定的时候自动创建。
onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
两种启动方式,在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。