service生命週期及使用

2022-09-04 04:36:11 字數 3305 閱讀 7360

後台服務就是處於後台執行的

圖:左圖:啟動方式的生命週期 右圖:繫結方式的生命週期

在服務分類中,提到了3種服務通訊型別,一種是通過startservice()直接啟動服務,一種是通過bindservice()的方式啟動,2種啟動方式對應的生命週期如上圖所示。3.使用aidl方式的service

下面就說說2種服務的啟動流程:

1.context.startservice() 啟動流程(後台處理工作):

context.startservice() -> oncreate() -> onstartcommand() -> service running -> context.stopservice() -> ondestroy() -> service stop

所以呼叫startservice的生命週期大致為:

oncreate(只在建立的時候呼叫一次直到被摧毀) --> onstartcommand (服務開啟後,可多次呼叫) --> ondestroy

服務中的onstartcommand(intent intent, int flags, int startid)方法會返回乙個唯一的整數識別符號來識別啟動請求,啟動請求可以是start_sticky、start_sticky_compatibility、start_not_sticky、start_redeliver_intent等,標誌位可以是start_flag_redelivery、start_flag_retry。

從圖中我們可以看出,oncreate方法只在建立時候被呼叫了一次,這說明:service被啟動時只呼叫一次oncreate()方法,如果服務已經被啟動,在次啟動的service元件將直接呼叫onstartcommand()方法,通過這樣的生命週期,可以根據自身需求將指定操作分配進oncreate()方法或onstartcommand()方法中。

2.context.bindservice()啟動流程(在本地同一程序內與activity互動):

context.bindservice() -> oncreate() -> onbind() -> service running -> onunbind() -> ondestroy() -> service stop

bindservice的生命週期簡化為為:oncreate --> onbind --> onunbind --> ondestory

通過該方法,服務啟動時會呼叫oncreate()來啟動服務,可是它不會呼叫onstartcommand() 方法,並且只有在所有的服務都接觸了後,服務才會自動停止執行。通過服務的onbind()方法,可以獲的乙個客戶端與伺服器進行通訊的ibdiner介面。ibind允許客戶端**服務的方法,比如得到service的例項、執行狀態或其他操作。這個時候把呼叫者(context,例如activity)會和service繫結在一起,context退出了,srevice就會呼叫onunbind->ondestroy相應退出。

注:繫結服務的android組建在摧毀前應解除繫結,否則會造成記憶體洩漏。

3.使用aidl方式的service(進行跨程序通訊)(這塊不是很懂,這裡就不提了)

public class myservice extends service {}
startservice(intent);

服務類中:

@override

public void oncreate()

@override

public int onstartcommand(intent intent, int flags, int startid)

@override

public void ondestroy()

繫結乙個服務,需要設定serviceconnection和標誌位,方法如下:

bindservice(intent service, serviceconnection conn, int flags)
serviceconnection可以監聽服務的狀態,在進行服務繫結的時,其標誌位可以為以下幾種(這裡列出3種):

1).context.bind_auto_create

說明:表示收到繫結請求的時候,如果服務尚未建立,則即刻建立,在系統記憶體不足需要先摧毀優先順序元件來釋放記憶體,且只有駐留該服務的程序成為被摧毀物件時,服務才被摧毀

2).context.bind_debug_unbind

說明:通常用於除錯場景中判斷繫結的服務是否正確,但容易引起記憶體洩漏,因此非除錯目的的時候不建議使用

3).context.bind_not_foreground

說明:表示系統將阻止駐留該服務的程序具有前台優先順序,僅在後台執行,該標誌位位於froyo中引入。

注意:繫結服務的以非同步方式執行的。繫結服務必須在當前的上下文環境中執行,某些場景中,通過上下文進行新增繫結接觸方法如下:

**如下:

/** 是否繫結 */

boolean misbound = false;

/** 繫結服務 */

public void dobindservice()

/** 解除繫結服務 */

public void dounbindservice() }

private serviceconnection mconnection = new serviceconnection()

@override

public void onservicedisconnected(componentname name)

};

服務類中:

@override

public void oncreate()

/** 繫結的ibinder */

private final ibinder mbinder = new localbinder();

public class localbinder extends binder

} @override

public ibinder onbind(intent intent)

@override

public boolean onunbind(intent intent)

(1)啟動服務停止有2種方法:

1)stopself() 自我停止服務

2)stopservice(intent name) 被動停止服務

(2)繫結服務的解除繫結方法如下:

unbindservice(serviceconnection conn)

service生命週期

service 生命週期 注意 onstart方法是在android2.0之前的平台使用的.在2.0及其之後,則需重寫onstartcommand方法,同時,舊的onstart方法則不會再被呼叫.1 可以通過呼叫 context.startservice 啟動乙個 service 這可能會觸發 se...

Service生命週期

1 通過startservice開啟服務 oncreate onstartcommand 2 通過stopservice關閉服務 ondestroy 說明 如果在未stopservice的情況下,再去startservice,只會onstartcommand 3 通過bindservice開啟服務 ...

Service生命週期

service生命週期 使用context.startservice 啟動service 其生命週期為context.startservice oncreate onstart service running context.stopservice ondestroy service stop 如果...