最近在開發有關於檔案傳輸的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等畫面細節的調整
路過看到這篇文章
回覆刪除感到寫的很用心
也給了我一些參考
感謝分享