標籤:
源碼中用以下載用戶端的類為DownloadService,是一個服務。如果你對android服務不夠理解的話,建議先查閱下有關服務的知識點。源碼分析如下:
1首先我們先來看下該服務中幾個重寫的方法:
1.1onCreate()中 首先聲明了自訂的綁定器對象,並在自訂的綁定器中添加了幾個介面可以訪問服務的方法,我們發現在這幾個方法中,目前實際用到的start()方法用以開始下載APK,其他的沒有用到。擷取通知管理器。設定服務為 非前台服務。代碼注釋中,火蟻表明了不確定性。 其實如果將服務設定為前台服務,綁定到一個通知中,那麼APP的應用的程式層級就相對較高,可以有效降低服務被殺死的可能性。本人在實際開發中就用到了前台服務。
1.2onBind()函數中擷取相關變數,返回綁定器對象。此處,可以最佳化下,既然已經自訂了綁定器,在綁定器中聲明了相關方法,我們可以將一些變數的設定放在綁定器聲明的方法中,這樣可以確保,當多個Activity與服務綁定時,方便處理,比如多個下載任務。
2定義下載線程,實現Runnable介面的方式。Runnable mdownApkRunnable = new Runnable() ;因為下載相對耗時,而服務本身又是運行在主線程中,因此用子線程專門去負責下載;
3定義了一個訊息處理器 Handler mHandler = new Handler(),當收到子線程(下載線程)發出的訊息後, 處理下載進度更新,下載完成安裝APK,取消通知的功能。
4核心下載方法downloadUpdateFile(),此方法中目前完成了基本的下載功能,如果下載半途,中斷連線的話,則下載失敗,沒有任何處理,建議在捕獲異常的情況下通過回調或者廣播通知使用者下載失敗,另外需要關閉服務。如果再強大點,就是如何?斷點續傳。 此處火蟻在子線程中,每10下做一次更新,避免頻繁更新通知的進度,過渡消耗資源。
5啟動下載服務的方法在UIHelper類中的openDownLoadService方法。此方法中用到了兩個啟動服務的方法,為什麼要用兩種呢?首先,我們要和服務通訊,利用綁定器去訪問啟動下載的方法,所有肯定要用到bindService(intent, conn, Context.BIND_AUTO_CREATE)方法,另外,使用者在介面執行完下載更新後,會可能跳轉到其他介面,也就是說當前和服務綁定的介面銷毀了,那麼他解除了和服務之間的綁定,如果只有這個介面和服務綁定了那麼介面銷毀時,意味著和服務的所有綁定解除時,服務就會執行onbind()方法,進而執行ondestroy()方法,服務銷毀,無法繼續下載。但是當用startService方法時,及時訪問者退出了訪問,但是服務仍然在運行,仍然可以繼續下載。
6其他和下載相關的一個死MainActivity中的checkUpdate(),檢查伺服器是否有更新資訊。另一個是UpdateManager類根據檢查更新的結果做相應的處理。
開源中國 OsChina Android 用戶端源碼分析(9)下載APK功能