android四大基礎組件--Service生命週期詳解

android四大基礎組件--ServiceServiceandroid

生命週期詳解多線程


一、Service的生命週期:異步


I> 在非綁定Service狀況下,只有oncreate(),onStartCommand(),onDestory()方法狀況下:ide

    

  操做方法對應生命週期一:學習

   a、【執行startService(Intent)優化

   執行生命週期方法:oncreate()--->onStartCommand();spa

   b、【執行stopService(Intent)】 線程

   執行生命週期方法:onDestory();orm


  操做方法對應生命週期二: blog

   a、【執行startService(Intnet)

   執行生命週期方法:oncreate()--->onStartCommand();

   b、【執行返回鍵】--->【執行startService(Intnet)

   執行生命週期方法:onStartCommand();

   c、【執行stopService(Intent)

   執行生命週期方法:onDestory();

   d、【執行startService(Intnet)

   執行生命週期方法:oncreate()--->onStartCommand();

   e、【執行stopService(Intent)】--->【執行返回鍵】--->【執行startService(Intnet)】    執行生命週期方法:oncreate()--->onStartCommand()

 

  總結:

  只有當service被首次建立的時候纔會執行oncreate()方法,同個service被屢次啓動的時候就不會調用oncreate()方法,可是每次的啓動都會調用onstartCommand()方法;


II> 在綁定Service狀況下,只有onCreate(),onBind(Intent intent),onUnbind(Intent intent),onDestroy()方法狀況下:


  操做方法對應生命週期:

  a、【執行bindService(intent,conn, Service.BIND_AUTO_CREATE)

  執行生命週期方法:oncreate()--->onBind()---> ServiceConnection類的onServiceConnected()(做用:activity與service創建鏈接的方法);

  b、【執行unbindService(conn)

  執行生命週期方法:onUnbind()--->onDestory();


wKiom1gb9faD_DeNAAA_NBiAmp0899.png

wKioL1gb9fazSqZTAAA2SQg7oYQ507.png

wKioL1gb9faz32vIAABF_mdumLs242.png



III>綁定service和非綁定service混合使用執行的生命週期


  操做方法:

  a、【執行startService

  執行生命週期方法:onCreate()-->onStartCommand();

  b、【執行bindService

  執行生命週期方法:onBind()--->onServiceConnected();

  c、【執行onUnbindService

  執行生命週期方法:onUnbind();

  d、【執行bindService

  執行生命週期方法:onServiceConnected()-->onRebind();

  e、【執行onUnbindService

  執行生命週期方法:onUnbind;

  f、【執行stopService

  執行生命週期方法:onDestory()


wKiom1gb9lCxmcaXAABgDsGmlac359.png


調用Service以下:


wKioL1gb9pWSge5RAACUo_Kt2GE739.png

執行的打印結果以下:

wKioL1gb9uDDNxQMAABIuCdNKRw029.png


總結:

一、當service執行startService操做之後,執行bindService,在service被綁定之後沒有解綁的狀況下,去執行stopService,此時不會觸發Service的onDestory方法,可是解除綁定之後,繼續執行stopService將觸發onDestory方法。

二、ServiceConnection類中,若是service意外的發生中斷,則此類中的onServiceDisconnected方法將會被調用執行;正常的中斷(如:執行unbindService方法),則此類中的onServiceDisconnected方法不會被調用。

三、若是一個Service使用兩種模式開啓(bindService和startService),則必須保證兩個生命週期都結束,才能執行onDestory方法。例如:bindxx--》startxx--》stopxx 或者 startxx--》bindxx--》stopxx,以上兩種狀況均不會執行onDestory()方法。

四、service與activity使用bindService進行綁定,並不能將service 的生命週期與activity的生命週期綁定。在部分狀況下,取消綁定的時候也僅僅是取消service與activity之間的關係,並不能中止該service。

五、service中並不可以執行耗時操做,由於service與所在的應用位於同一個進程,而且service也並非一條新的線程,若是執行耗時操做,將會出現ANR(Application Not Responding)異常。



二、IntentService執行原理


a>使用隊列來管理Intent請求,每當客戶端代碼經過Intent請求啓動IntentService時,IntentService將會把Intent加入隊列,而後開啓一條新的線程來處理該Intent;


b>對於異步 的startService()請求,IntentService會按次序一次處理隊列中的Intent,該線程保證同一時刻只處理一個Intent;


c>IntentService會建立單獨的線程來處理onHandleIntent()方法實現的代碼,所以開發者無需處理多線程的問題;


d>當消息請求處理完之後IntentService會自動中止,開發者無需調用stopSelf()方法中止service;


e>爲Service的onBind()方法提供了默認的實現,默認實現的onBind()返回null;


f>爲Service的onstartCommand()方法也提供了默認的實現,該實現會將請求Intent添加到隊列中。


三、Service和IntentServiceActivity的最主要區別

IntentService裏面可以執行耗時操做,而不會形成UI線程阻塞。



總結:

   上述文章經過在android studio中的運行,完整的展示了Service經常使用生命週期方法的執行過程,經過了解以上的過程可以方便咱們程序的開發,在適當的生命週期,執行對應的方法,這樣有助於程序的優化、方便後期的維護和減小內存沒必要要的浪費,更有助於咱們對android底層學習。同時也對Service和IntentService進行了比較,以及IntentService的執行原理。不足之處,請你們不惜賜教。

相關文章
相關標籤/搜索