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);