Android Service和AIDL用處

Service和Thread到底有什麼關係呢?何時應該用Service,何時又應該用Thread?答案可能會有點讓你吃驚,由於Service和Thread之間沒有任何關係!線程

之因此有很多人會把它們聯繫起來,主要就是由於Service的後臺概念。Thread咱們你們都知道,是用於開啓一個子線程,在這裏去執行一些耗時操做就不會阻塞主線程的運行。而Service咱們最初理解的時候,總會以爲它是用來處理一些後臺任務的,一些比較耗時的操做也能夠放在這裏運行,這就會讓人產生混淆了。可是,若是我告訴你Service實際上是運行在主線程裏的。日誌

在MainActivity的onCreate()方法里加入一行打印當前線程id的語句:進程

  1. Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId());  

而後在MyService的onCreate()方法裏也加入一行打印當前線程id的語句:get

  1. Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId());  

如今從新運行一下程序,並點擊Start Service按鈕,會看到以下打印日誌:it

能夠看到,它們的線程id徹底是同樣的,由此證明了Service確實是運行在主線程裏的,也就是說若是你在Service裏編寫了很是耗時的代碼,程序一定會出現ANR的。thread

那我要Service又有何用呢?其實你們不要把後臺和子線程聯繫在一塊兒就好了,這是兩個徹底不一樣的概念。Android的後臺就是指,它的運行是徹底不依賴UI的。即便Activity被銷燬,或者程序被關閉,只要進程還在,Service就能夠繼續運行。後臺

Service進行後臺一些耗時任務的操做怎麼辦?Service裏也要建立一個子線程,那爲何不直接在Activity裏建立呢?這是由於Activity很難對Thread進行控制,當Activity被銷燬以後,就沒有任何其它的辦法能夠再從新獲取到以前建立的子線程的實例。並且在一個Activity中建立的子線程,另外一個Activity沒法對其進行操做。可是Service就不一樣了,全部的Activity均可以與Service進行關聯,而後能夠很方便地操做其中的方法,即便Activity被銷燬了,以後只要從新與Service創建關聯,就又可以獲取到原有的Service中Binder的實例。所以,使用Service來處理後臺任務,Activity就能夠放心地finish,徹底不須要擔憂沒法對後臺任務進行控制的狀況。程序

Service中開啓線程去執行耗時任務,這樣就能夠有效地避免ANR的出現。還有其餘方法能夠防止ANR沒?固然有,將一個普通的Service轉換成遠程Service。那麼進程間通訊如何處理呢?AIDL,這就是Service和AIDL用途的緣由了。方法

相關文章
相關標籤/搜索