Android開發之旅(二)服務生命週期和廣播接收者生命週期

來源:互聯網
上載者:User

標籤:

引言

應用程式組件有一個生命週期——一開始Android執行個體化他們響應意圖,直到結束執行個體被銷毀。在這期間,他們有時候處於啟用狀態,有時候處於非啟用狀態;對於活動,對使用者有時候可見,有時候不可見。組件生命週期將討論活動、服務、廣播接收者的生命週期——包括在生命週期中他們可能的狀態、通知狀態改變的方法、及這些狀態的組件寄宿的進程被終結和執行個體被銷毀的可能性。

上篇Android開發之旅:組件生命週期(一)講解了論活動的生命週期及他們可能的狀態、通知狀態改變的方法。本篇將介紹服務和廣播接收者的生命週期:

    服務生命週期
    廣播接收者生命週期

1、服務生命週期

一個服務可以用在兩個方面:

    它可以啟動且允許一直運行直到有人停止它,或者它自己停止。在這種模式,通過調用Context.startService()啟動服務及通過調用Context.stopService()停止服務。服務也可以通過調用Service.stopSelf()或Service.stopSelfResult()停止自己。僅需要調用一次stopService()停止服務,而不管調用startService()了多少次。
    通過使用相關介面可以編程地操作服務。用戶端建立與Service對象的一個串連及使用該串連調入服務。串連通過調用Context.bindService()建立,通過調用Context.unbindService()關閉。多個用戶端可以綁定到同一個服務。如果服務尚未啟動,bindService()可以選擇啟動它。

這兩種模式並不是完全分離的。你可以綁定到一個用startService()啟動的服務。例如,一個後台音樂服務可以通過使用定義了音樂播放的Intent對象調用startService()啟動。直到後來,使用者可能想對播放器做一些控制或者擷取當前歌曲的一些資訊,一個活動將調用bindService()與服務建立串連。在這種情況下,實際上直到最後一個綁定關閉stopService()並不會停止。

像活動一樣,一個服務也有生命週期方法,你可以執行監視它的狀態改變。但是比活動的生命週期方法更少,只有三個且它們是公有的(public)而不是受保護的(protected)(說明:活動的生命週期方法是protected的):

    void onCreate()
    void onStart(Intent intent)
    void onDestory()

通過這三個方法,你可以監視服務生命週期的兩個嵌套迴圈:

    服務的整個生命時間(entire lifetime),從調用onCreate()到相應地調用onDestory()。像一個活動一樣,服務在onCreate()中做一些初始設定,且在中釋放所有的資源。例如,一個音樂播放服務可以在onCreate()中建立線程,然後在onDestory()中停止線程。
    服務的活躍生命時間(active lifetime),從調用onStart()開始。這個方法傳遞參數是傳送給startService()的Intent對象。音樂服務將開啟Intent,瞭解播放哪個音樂並且開始播放。
    沒有相應的回調方法,因為服務停止沒有onStop()方法。

startService()和onDestory()被所有服務調用,不管是通過Context.startService()啟動還是通過Context.bindService()啟動的。然而,onStart()僅被通過startService()啟動的服務調用。

如果一個服務允許別的綁定到它,有一些額外的回調方法來實現它:

    IBinder onBind(Intent intent)
    boolean onUnbind(Intent intent)
    void onRebind(Intent intent)

onBind()回調傳遞的參數是傳給bindService()的Intent對象,onUnbind()回調傳遞的參數是傳給unbindService()的Intent對象。如果服務允許綁定,onBind()返回用戶端與服務互動的通訊通道。onUnbind()方法可以要求調用onRebind(),如果一個新的用戶端串連到服務。

解釋了服務的回調方法。雖然,它分離了由startService()啟動的服務和由bindService()啟動的服務,記住任何服務,無論它怎麼啟動的,都可能允許用戶端綁定到它,因此任何服務可能接收onBind()和onUnbind()調用。

service_lifecycle
2、廣播接收者生命週期

一個廣播接收者有一個回調方法:void onReceive(Context curContext, Intent broadcastMsg)。當一個廣播訊息到達接收者是,Android調用它的onReceive()方法並傳遞給它包含訊息的Intent對象。廣播接收者被認為僅當它執行這個方法時是活躍的。當onReceive()返回後,它是不活躍的。

有一個活躍的廣播接收者的進程是受保護的,不會被殺死。但是系統可以在任何時候殺死僅有不活躍組件的進程,當佔用的記憶體別的進程需要時。

這帶來一個問題,當一個廣播訊息的響應時費時的,因此應該在獨立的線程中做這些事,遠離使用者介面其它組件啟動並執行主線程。如果onReceive()衍生線程然後返回,整個進程,包括新的線程,被判定為不活躍的(除非進程中的其它應用程式組件是活躍的),將使它處於被殺的危機。解決這個問題的方法是onReceive()啟動一個服務,及時服務做這個工作,因此系統知道進程中有活躍的工作在做。

 

本系列的其它文章:

Android開發之旅:環境搭建及HelloWorld
Android開發之旅:HelloWorld項目的目錄結構
Android開發之旅:android架構
Android開發之旅:應用程式基底礎及組件
Android開發之旅:應用程式基底礎及組件(續)
Android開發之旅:活動與任務
Android開發之旅:進程與線程
Android開發之旅:組件生命週期(一)
    建議您從頭再看一遍,絕對會有新的收穫!
    從android架構到這篇基本內容都是意譯自Android SDK文檔。

原文地址:http://www.cnblogs.com/skynet/archive/2010/05/06/1729332.html
吳秦
出處:http://www.cnblogs.com/skynet/
本文基於署名 2.5 中國大陸許可協議發布,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名吳秦(包含連結).

Android開發之旅(二)服務生命週期和廣播接收者生命週期

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.