IntentService是一個專門用來處理異步線程的一個服務,它内部建立了一個消息隊列以及一個Handler對象,其它元件将Intent發送過來之後,IntentService會将這個Intent通過消息隊列發送到工作線程,是以,我們可以放心大膽的在IntentService内部做耗時操作,而不必單獨開啟線程。
好,大概描述了下,我們看一下它的實作方式:
将注釋代碼删除掉之後,真正的實作代碼很少,現在将對這些代碼一一說明,首先是onCreate方法:
onCreate方法主要做了以下事情:
建立HandlerThread線程并啟動,使用HandlerThread對象所建立的Looper對象初始化ServiceHandler對象,這樣,就可以通過ServiceHandler對象HandlerThread中的消息隊列發送資料了,我們看看他們之間是如何實作的,首先是HandlerThread:
這個中的代碼也不多,我們看主要的run方法:
run方法主要做了以下事情:
調用Looper.prepare();在目前線程中初始化一個Looper消息循環對象,并初始化了一個消息隊列,拿到這個線程的Looper對象,然後開啟消息循環通路模式。
接着回到IntentService的onCreate方法中,使用剛才的工作線程中的Looper對象來初始化ServiceHandler,使mServiceHandler對象向這個線程的Looper中發送消息。
準備工作做好之後,接下來的邏輯就簡單了,其它元件通過startService方法,将Intent傳遞到這個服務中,會調用onStartCommand方法,onStartCommand調用onStart方法,而onStart方法會将接收到的Intent對象作為被傳送的消息實體通過ServiceHandler發送到工作線程,然後我們如果使用的話,直接重寫onHandleIntent就可以,onHandleIntent收到對象的時候已經處在工作線程當中。
我們在onHandleIntent方法中處理完畢任務之後,不必手動去調用stopSelf去停止服務,IntentService已經幫我們做了這樣的處理。說到這裡,可能你會有疑問,如果我在很短的時間内發送了多個請求,那麼第一個請求處理完畢那服務不就終止了嗎,後面的怎麼處理呢,對于這個問題,需要詳細了解一下stopSelf的說明:
如果我們現在工作在預設模式,同一時間隻有一個Intent會被處理,如果在目前這個任務處理結束之前還有一個Intent請求過來的話,那它就不會被終止,它的原因與stopSelf有關系,stopSelf會判斷終止的startId是否是最後發送過來的startId,是以,疑問解決了。
到這裡基本的解釋就說完了,有疑問歡迎留言。