天天看點

記錄一下對service生命周期的了解

最近突然想測試一下android service的生命周期,于是就自己寫了一個demo感受了一下,确實挺奇妙的。

service有兩種啟動方式,bindservice和startservice,單獨使用的話,生命周期很明顯:

第一種:bindservice(),三個參數,第一個intent,第二個是一個interface -> serviceconnection,第三個參數是bind的類型,有這麼幾種:

BIND_AUTO_CREATE //表示收到綁定請求的時候,如果服務尚未建立,則即刻建立,在系統記憶體不足需要先摧毀優先級元件來釋放記憶體,且隻有駐留該服務的程序成為被摧毀對象時,服務才被摧毀
BIND_DEBUG_UNBIND //通常用于調試場景中判斷綁定的服務是否正确,但容易引起記憶體洩漏,是以非調試目的的時候不建議使用
BIND_NOT_FOREGROUND //表示系統将阻止駐留該服務的程序具有前台優先級,僅在背景運作,該标志位位于Froyo中引入。
BIND_ABOVE_CLIENT和BIND_IMPORTANT //當你的用戶端在前台,這個标示符下的Service也變得重要性相當于前台的Activity       
優先級迅速提升。若是BIND_ABOVE_CLIENT,則優先級已經超過了Activity,也就是說Activity要比Service先死,      
當資源不夠的時候。      
BIND_ALLOW_OOM_MANAGEMENT      

通過bindservice啟動一個service的生命周期是onCreate-->onBind-->(onServiceConnection)->onDestory

第二種:startService() 就一個參數,一個intent,生命周期:

onCreate-->onStartCommand->onDestory

如果bind一個service之後調用stopService會怎麼樣呢?

答案是沒用

也就是說不會掉用onDestory,當然了這都是通過context裡面的方法調用的,在service裡面去調用stopSelf()也是不可以把目前Service停掉的,隻能通過unbindservice來停止。

如果start一個service之後是可以再bind這個service,并且bind這個service之後是不可以調用stopService停止的。bind的時候隻會調用onBind生命周期。

在測試過程中會發現一個startId的東西,這個東西是幹什麼用的呢?

這個startId是記錄service start的次數,也算是一個标記吧,當調用stopSelf(int startId)的時候,可以傳一個startId來停止服務。這樣隻有在達到預定的start次數才會停止。

今天就先記錄到這裡吧,有空再去測試其他的東西。