startService和bindService的區(qū)別?
service的生命周期方法比activity少一些,只有oncreate,onstart,ondestroy
我們有兩種方式啟動(dòng)一個(gè)service,他們對(duì)service生命周期的影響是不一樣的。
1通過startservice
service會(huì)經(jīng)歷oncreate-->onstart
stopservice的時(shí)候直接ondestroy
如果是調(diào)用者直接退出而沒有調(diào)用stopservice的話,service會(huì)一直在后臺(tái)運(yùn)行。
下次調(diào)用者再起來仍然可以stopservice。
2通過bindservice
service只會(huì)運(yùn)行oncreate,這個(gè)時(shí)候調(diào)用者和service綁定在一起
調(diào)用者退出了,srevice就會(huì)調(diào)用onunbind-->ondestroyed
所謂綁定在一起就共存亡了。
注意:service的oncreate的方法只會(huì)被調(diào)用一次,
就是你無論多少次的startservice又bindservice,service只被創(chuàng)建一次。
如果先是bind了,那么start的時(shí)候就直接運(yùn)行service的onstart方法,
如果先是start,那么bind的時(shí)候就直接運(yùn)行onbind方法。如果你先bind上了,就stop不掉了,
只能先unbindservice,再stopservice,所以是先start還是先bind行為是有區(qū)別的。
android中的服務(wù)和windows中的服務(wù)是類似的東西,服務(wù)一般沒有用戶操作界面,它運(yùn)行于系統(tǒng)中不容易被用戶發(fā)覺,可以使用它開發(fā)如監(jiān)控之類的程序。
服務(wù)不能自己運(yùn)行,需要通過調(diào)用context.startservice()或context.bindservice()方法啟動(dòng)服務(wù)。
這兩個(gè)方法都可以啟動(dòng)service,但是它們的使用場合有所不同。使用startservice()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒有關(guān)連,
即使調(diào)用者退出了,服務(wù)仍然運(yùn)行。使用bindservice()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止,大有“不求同時(shí)生,必須同時(shí)死”的特點(diǎn)。
如果打算采用context.startservice()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的oncreate()方法,
接著調(diào)用onstart()方法。如果調(diào)用startservice()方法前服務(wù)已經(jīng)被創(chuàng)建,多次調(diào)用startservice()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù),
但會(huì)導(dǎo)致多次調(diào)用onstart()方法。采用startservice()方法啟動(dòng)的服務(wù),只能調(diào)用context.stopservice()方法結(jié)束服務(wù),服務(wù)結(jié)束時(shí)會(huì)調(diào)用ondestroy()方法。
如果打算采用context.bindservice()方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),系統(tǒng)會(huì)先調(diào)用服務(wù)的oncreate()方法,
接著調(diào)用onbind()方法。這個(gè)時(shí)候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出了,系統(tǒng)就會(huì)先調(diào)用服務(wù)的onunbind()方法,
接著調(diào)用ondestroy()方法。如果調(diào)用bindservice()方法前服務(wù)已經(jīng)被綁定,
多次調(diào)用bindservice()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說oncreate()和onbind()方法并不會(huì)被多次調(diào)用)。
如果調(diào)用者希望與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindservice()方法,調(diào)用該方法也會(huì)導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onunbind()-->ondestroy()方法.
onbind將返回給客戶端一個(gè)ibind接口實(shí)例,ibind允許客戶端回調(diào)服務(wù)的方法,比如得到service運(yùn)行的狀態(tài)或其他操作。這個(gè)時(shí)候調(diào)用者會(huì)和service綁定在一起,但onbind只能一次,不可多次綁定。
在service每一次的開啟關(guān)閉過程中,只有onstart可被多次調(diào)用(通過多次startservice調(diào)用),其他oncreate,onbind,onunbind,ondestory在一個(gè)生命周期中只能被調(diào)用一次。
由于android中的service使用了onbind的方法去綁定服務(wù),返回一個(gè)ibinder對(duì)象進(jìn)行操作,而我們要獲取具體的service方法的內(nèi)容的時(shí)候,我們需要ibinder對(duì)象返回具體的service對(duì)象才能操作,所以說具體的service對(duì)象必須首先實(shí)現(xiàn)binder對(duì)象,這個(gè)樣子的話我們才能利用bindservice的方法對(duì)service進(jìn)行綁定,獲取binder對(duì)象之后獲取具體的service對(duì)象,然后才獲取service中的方法等等。
與采用context.startservice()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法
oncreate()--onstart()--ondestroy()
oncreate()該方法在服務(wù)被創(chuàng)建時(shí)調(diào)用,該方法只會(huì)被調(diào)用一次,無論調(diào)用多少次startservice()或bindservice()方法,服務(wù)也只被創(chuàng)建一次。
onstart()只有采用context.startservice()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在服務(wù)開始運(yùn)行時(shí)被調(diào)用。多次調(diào)用startservice()方法盡管不會(huì)多次創(chuàng)建服務(wù),但onstart()方法會(huì)被多次調(diào)用。
ondestroy()該方法在服務(wù)被終止時(shí)調(diào)用。
與采用context.bindservice()方法啟動(dòng)服務(wù)有關(guān)的生命周期方法
oncreate()--onbind()--onunbind()--ondestroy()
onbind()只有采用context.bindservice()方法啟動(dòng)服務(wù)時(shí)才會(huì)回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時(shí)被調(diào)用,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用context.bindservice()方法并不會(huì)導(dǎo)致該方法被多次調(diào)用。
轉(zhuǎn)載