Android中Activity、Service和線程之間的通訊


Activity、Service和線程應該是Android編程中最多見的幾種類了,幾乎大多數應用程序都會涉及到這幾個類的編程,天然而然的,也就會涉及到三者之間的相互通訊,本文就試圖簡單地介紹一下這三者通訊的方式。
想寫這篇文章的原由是,筆者跟幾個同窗在作一個Android上的應用,起初代碼寫得很凌亂,由於我在Activity中直接建立了線程,去執行某些任務。可是咱們知道線程可能須要運行的時間比較長,而Android在內存不足的時候,會將一些Activity銷燬,這樣線程就會失去了管理的對象,從而使程序發生意想不到的結果。此外,在Activity中建立線程,線程跟Activity的通訊也比較麻煩,通常藉助Handler類來進行通訊( http://blog.sina.com.cn/s/blog_3fe961ae0100mvc5.html)。
與Activity相比,Service通常「默默」地運行在後臺,生命週期比較長,因此它更合適去爲主程序提供某些服務,建立線程並管理線程。所以,筆者將原程序改爲三層架構,從高到低分別爲:Activity層--Service層--Thread層。Activity將須要的服務「告訴」Service層,Service層建立Thread去完成服務。Thread將任務的進度、狀態、錯誤信息反饋給Service,Service將這些消息反饋給相關的Activity,而且還能夠利用Notification更新通知欄消息。大致的結構就是這樣。
 
1 Activity和Service之間的通訊
 
1.2 Activity調用startService (Intent service)方法,將消息添加到Intent對象中,這樣Service對象能夠在調用onStartCommand (Intent intent, int flags, int startId)的時候能夠獲得這些消息。這種方法很簡單,但若是有大量的信息要傳遞的話,就很麻煩了。由於Service端還要判斷一下消息是什麼,才能做進一步的動做。
 
1.3 Activity調用bindService (Intent service, ServiceConnection conn, int flags)方法,獲得Service對象的一個引用,這樣Activity能夠直接調用到Service中的方法。具體代碼:
 
1.4 Service向Activity發送消息,除了能夠利用Handler外,還可使用廣播,固然Activity要註冊相應的接收器。好比Service要向多個Activity發送一樣的消息的話,用這種方法就更好。具體方法能夠看一下這篇文章:
 
2 Service跟Thread之間的通訊
2.1 Service建立Thread後,若是要對線程進行控制(啓動,暫停,中止等),那麼Service中應該保留線程的引用,這不用多說。那麼有了這個引用,Service就能夠直接調用Thread的其它方法了。運行的線程要向Service發送消息的話,一般使用Handler就能夠了:
 
 
3 Activity和Thread之間的通訊
不用多想了,直接使用Handler吧。不推薦Activity直接去建立線程,由於很差管理線程。
相關文章
相關標籤/搜索