2009年8月7日 星期五

Browser download function in Android


最近在開發有關於檔案傳輸的Android程式,突然心血來潮去看Android Framework內建的瀏覽器下載功能是如何進行設計的,看過原始碼才知道,其完全遵守MVC原則,縱使只是一個單純的下載工具。

右邊的圖顯示了概略的關係,並沒有使用正規UML,請多多包涵。

現在就從DownloadService開始吧


一 - 下載工作執行 (Control)

classes:
com.android.providers.downloads.DownloadReceiver
com.android.providers.downloads.DownloadService
com.android.providers.downloads.DownloadService.UpdateThread
com.android.providers.downloads.DownloadThread

實際上執行檔案下載的邏輯,其並無包含scheduling,任何task進來都是立即開始。

瀏覽器藉由新增DB record來觸發下載工作,DownloadService使用UpdateThread去monitor DB,若發現DB有需要處理的download工作,就會立刻new 出新的DownloadThread去handle實際的下載工作,並存有一份ArrayList (mDownloads)作為local memory cache

---------------------infinite for loop--------------------

1. 比對mDownloads與DB中的record
1-1. 若DB的record比mDownloads還多,則代表有新的工作,立刻開始新的下載
1-2. 若DB的record比mDownloads還少,則代表有工作已經被使用者從UI刪除,立刻停止並刪除該下載
2. 通知Notification bar目前的狀態 (請參照四 - UI - 顯示狀態於Notification bar (View))

------------------------------------------------------------

DownloadThread並會把下載狀態透過ContentResolver/ContentProvider介面隨時 persistent至 SQLite DB (DownloadProvider) 裡


二 - 下載資訊persistence (Model, 橘色部分)

classes:
com.android.providers.downloads.DownloadProvider
(implements ContentProvider with SQLite DB)

儲存所有下載即時/歷史資訊的DB,其透過實作ContentProvider,可提供所有ap進行查詢

使用URI為 content://downloads/download
(android.provider.Downloads.CONTENT_URI)


三 - UI - 下載歷史資訊列表 (View)

classes:
com.android.browser.BrowserDownloadPage
com.android.browser.BrowserDownloadAdapter

當user點選menu中的下載歷史紀錄時,會顯示此Activity,其使用ListView + BrowserDownloadAdapter (繼承ResourceCursorAdapter,可方便透過Cursor介面撈DB中的資料並顯示於ListActivity中)

四 - UI - 顯示狀態於Notification bar (View)

classes:
com.android.providers.downloads.DownloadNotification

DownloadService內部有UpdateThread,其會定時更新Notification bar中的狀態 (ProgressBar, 下載百分比)


筆者之前寫過J2SE, J2ME BD-J等AP,在軟體架構上相較於Android可以發現,Android很重視 data persistence (Preferences, ContentProvider....etc)與XML modeling (UI, Animation, style....etc),這讓AP開發者可以花更多的時間在需要的事情上,而不用擔心資料儲存的複雜狀態與程序,以及UI或Animaiton等畫面細節的調整


1 則留言:

  1. 路過看到這篇文章
    感到寫的很用心
    也給了我一些參考
    感謝分享

    回覆刪除