1. 程式人生 > >android 5.1 後臺下載服務分析

android 5.1 後臺下載服務分析

目的是分析DownloadService不斷有列印的原因。

目錄: \packages\providers\DownloadProvider

browser app -- android.app.DownloadManager ContentResolver.insert --

--> DownloadService {Notifier, DownloadThread, DownloadProvider, Scanner, Receiver}

記錄下載,開機後如果沒有下載完就重新下載;

發通知到狀態列;

通知媒體掃描入庫;

沒有下載或掃描的記錄,隔一段時間後重試。

-- MediaScannerConnection.connect --

--> MediaScannerService { MediaProvider}

目錄:packages\providers\MediaProvider

DownloadReceiver.java 處理廣播接收

ACTION_BOOT_COMPLETED

ACTION_MEDIA_MOUNTED

ConnectivityManager.CONNECTIVITY_ACTION

ACTION_RETRY -- 啟動服務:Context.startService DownloadService

ACTION_OPEN -- 用Toast提示開始下載

DownloadService.java

處理ALL_DOWNLOADS_CONTENT_URI中所有記錄:

如果沒有下載完成就重新下載;

如果沒有掃描,就啟動掃描;

如果存在記錄沒有下載完成或者沒有掃描完成, 5分鐘後再進行處理。

DownloadScanner.java

用MediaScannerConnection連線媒體掃描,

MediaScannerService處理完成後,通過DownloadProvider 標記為已掃描(資料庫中表downloads的欄位scanned =1)

DownloadProvider.java

對其他程序傳入的ContentValues會忽略特定欄位,比如COLUMN_MEDIA_SCANNED。

frameworks\base\media\java\android\media\MediaScannerConnection.java

connect 指定了包名和類名:

intent = new ComponentName("com.android.providers.media", "com.android.providers.media.MediaScannerService"));

mContext.bindService(intent, this, Context.BIND_AUTO_CREATE);