EP29-DownloadManager分析(2)

DownloadManager分析(2)

昨天說到:

  • DownloadManager分發(fā)任務(wù)給DownloadProvider
  • DownloadProvider調(diào)用DownloadService
  • DownloadService真正執(zhí)行下載操作

所以DownloadProvider做了什么便锨,怎么啟動DownloadService的?然后DownloadSerivce又是怎么實現(xiàn)下載的?

DownloadProvider做了什么

DownloadProvider的描述是:

Allows application to interact with the download manager.
允許應(yīng)用和download manager之間進行交互嘉栓。

Application可以是不同的Application催束,DownloadProvider繼承了ContentProvider肠鲫,所以可以實現(xiàn)數(shù)據(jù)共享牡整,事實上我們會發(fā)現(xiàn)下載到的內(nèi)容都會被顯示在「下載」這個原生APP里面次坡,當(dāng)然顯示與否在DownloadManager里面是可以打開/關(guān)閉的。

前面分析到兼蕊,Android N之前初厚,DownloadManager會把request以ContentValues形式pass給DownloadProvider.insert(),然后進行異步下載件蚕。

//傳遞URI和Content Values給ContentResolver
Uri downloadUri = mResolver.insert(Downloads.Impl.CONTENT_URI, values);

DownloadProvider的insert方法孙技,將下載信息寫入數(shù)據(jù)庫,包括下載鏈接地址等信息排作,然后會啟動DownloadService這個Service:

    //連請求頭都寫入了數(shù)據(jù)庫
    insertRequestHeaders(db, rowID, values);  
    //啟動DownloadService 
    context.startService(new Intent(context, DownloadService.class));  
    notifyContentChanged(uri, match);  
    return ContentUris.withAppendedId(Downloads.CONTENT_URI, rowID); 

DownloadService做了什么

UpdateThread

DownloadService會利用updateFromProvider從provider的數(shù)據(jù)庫里獲取下載的請求牵啦,然后啟動UpdateThread線程,這個線程會不斷地查找數(shù)據(jù)庫里還有沒有下載任務(wù)妄痪,以及還有沒有未完成的任務(wù)哈雏,直到完成才退出。

//UpdateThread的run方法
for (;;) {  
    synchronized (DownloadService.this) {  
        if (mUpdateThread != this) {  
            throw new IllegalStateException(  
                    "multiple UpdateThreads in DownloadService");  
        }  
        if (!mPendingUpdate) {  
            mUpdateThread = null;  
            if (!keepService) {  
                stopSelf();  
            }  
            if (wakeUp != Long.MAX_VALUE) {  
                scheduleAlarm(wakeUp);  
            }  
            return;  
        }  
        mPendingUpdate = false;  
    }  
    ...
    ...
}

DownloadThread

DownloadThread真正實現(xiàn)了下載衫生,里面有很多功能裳瘪,比如開始、暫停罪针、斷點續(xù)傳彭羹。每個下載任務(wù)都是獨立的線程,需要同步鎖/線程池來限制下載數(shù)量泪酱。
有這些方法:

  1. excuteDownload 執(zhí)行下載
  2. setupDestinationFile 設(shè)置目標位置派殷,如果位置已經(jīng)有了file还最,就繼續(xù)下載,實現(xiàn)了斷點續(xù)傳
  3. addRequestHeaders 添加請求頭
  4. checkConnectivity 檢查鏈接
  5. readFromResponse 讀取response
  6. writeDataToDestination 寫數(shù)據(jù)
  7. reportProgress 報告進度
  8. checkPauseOrCanceled 檢查暫驼毕В或取消
  9. cleanUpDestination 清空目標位置
  10. notifyDownloadComplete 通知下載完成(更新數(shù)據(jù)庫/發(fā)送廣播)

5~8是一個loop拓轻,不停地獲取網(wǎng)絡(luò)數(shù)據(jù)流,檢查下載是否暫停经伙。
關(guān)鍵的下載操作都是在DownloadThread里面實現(xiàn)的扶叉,如果想?yún)⒖季蛠磉@里看吧。另外帕膜,Android N之后DownloadProvider引入了Job Schedule辜梳,會將任務(wù)加入計劃,滿足指定條件再執(zhí)行操作泳叠,App不用駐留作瞄,可以省電,大概是這樣子危纫。

總結(jié)一下:

graph LR
DownloadManager-->DownloadProvider
DownloadProvider-->DownloadService
DownloadService-->UpdateThread
DownloadService-->DownloadThread
UpdateThread-->DownloadProvider

-Dec30

Reference:
[1]http://www.reibang.com/p/c9dc04af2f54#
[2]http://blog.csdn.net/zhiyi2010/article/details/19152979
[3]http://blog.csdn.net/qq_31726827/article/details/50462025

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宗挥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子种蝶,更是在濱河造成了極大的恐慌契耿,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螃征,死亡現(xiàn)場離奇詭異搪桂,居然都是意外死亡,警方通過查閱死者的電腦和手機盯滚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門踢械,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魄藕,你說我怎么就攤上這事内列。” “怎么了背率?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵话瞧,是天一觀的道長。 經(jīng)常有香客問我寝姿,道長交排,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任饵筑,我火速辦了婚禮埃篓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翻翩。我一直安慰自己都许,他們只是感情好稻薇,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胶征,像睡著了一般塞椎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睛低,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天案狠,我揣著相機與錄音,去河邊找鬼钱雷。 笑死骂铁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罩抗。 我是一名探鬼主播拉庵,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼套蒂!你這毒婦竟也來了钞支?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤操刀,失蹤者是張志新(化名)和其女友劉穎烁挟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骨坑,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撼嗓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欢唾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片且警。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匈辱,靈堂內(nèi)的尸體忽然破棺而出振湾,到底是詐尸還是另有隱情杀迹,我是刑警寧澤亡脸,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站树酪,受9級特大地震影響浅碾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜续语,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一垂谢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疮茄,春花似錦滥朱、人聲如沸根暑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排嫌。三九已至,卻和暖如春缰犁,著一層夾襖步出監(jiān)牢的瞬間淳地,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工帅容, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颇象,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓并徘,卻偏偏與公主長得像遣钳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麦乞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容