Android系統(tǒng)Download模塊研究

一、Download模塊簡(jiǎn)介##

首先,Android Download模塊主要由兩個(gè)部分構(gòu)成:DownloadManager以及DownloadProvider。 
  • DownloadManager:在Android L/M源碼位置:frameworks/base/core/java/android/app/DownloadManager.java作用:提供接口供三方apk調(diào)用
  • DownloadManager在Android L/M源碼位置:packages/providers/DownloadProvider/作用:具體下載的實(shí)現(xiàn),包括相關(guān)文件下載信息的保存以及文件的下載。

二、DownloadManager介紹##

1、靜態(tài)內(nèi)部類####

DownloadManager是系統(tǒng)開放給第三方應(yīng)用使用的類,包含兩個(gè)靜態(tài)內(nèi)部類 -DownloadManager.Query和DownloadManager.Request。

  • DownloadManager.Request用來請(qǐng)求一個(gè)下載
  • DownloadManager.Query 用來查詢下載信息

2、主要方法####

DownloadManager主要提供了一下主要方法:

  • enqueue(Request request):執(zhí)行下載,返回downloadId,downloadId可用于查詢下載信息。
  • remove(long ids):刪除下載,若下載中取消下載。會(huì)同時(shí)刪除下載文件和記錄。
  • query(Query query)查詢下載信息
  • getMaxBytesOverMobile(Context context)通過移動(dòng)網(wǎng)絡(luò)下載的最大字節(jié)數(shù)
  • getMimeTypeForDownloadedFile(long id)得到下載的mineType

三、DownloadProvider分析##

1、DownloadManager主要類介紹####

  • DownloadProvider:將下載信息insert到DB,啟動(dòng)下載服務(wù)類DownloadService
  • DownloadService:下載服務(wù)類,調(diào)用下載信息類DownlaodInfo,如果信息存在,則更新;否則,則新建該對(duì)象
  • DownloadInfo:下載信息類,啟動(dòng)下載線程類DownloadThread
  • DownloadThread:下載線程類,真正負(fù)責(zé)下載的線程,每次啟動(dòng)一個(gè)任務(wù)都會(huì)創(chuàng)建一個(gè)新的下載線程對(duì)象。進(jìn)行下載前的過程檢查、網(wǎng)絡(luò)監(jiān)測(cè)、路徑檢查等,保存文件……

2、下載流程分析####

下載流程時(shí)序圖

下載流程時(shí)序圖

四、案例分析##

1、問題描述###

插入SD卡,將默認(rèn)存儲(chǔ)設(shè)置為SD卡,重啟后進(jìn)入Play Store,F(xiàn)acebook無法更新,下載pokemon go等應(yīng)用,下載失敗。

2、問題分析###

根據(jù)相應(yīng)的Log分析,下載路徑無效。根據(jù)系統(tǒng)Environment.java文件,應(yīng)該動(dòng)態(tài)實(shí)現(xiàn)下載路徑的切換。
X項(xiàng)目默認(rèn)存儲(chǔ)方案是可動(dòng)態(tài)獲取路徑的:

  • 當(dāng)默認(rèn)存儲(chǔ)為內(nèi)部存儲(chǔ)時(shí),有效路徑應(yīng)該為/storage/emulated/0/Android/data/……
  • 當(dāng)默認(rèn)存儲(chǔ)為SD卡時(shí),有效路徑應(yīng)該為/storage/sdcard1/Android/data/……

3、解決方案###

Play store下載流程圖分析####

Play store下載流程圖分析

解決思路

修改DownloadProvider類中insert(),確保下載記錄的hint,data字段值正確從上面的流程圖分析,思路就很明確了。當(dāng)默認(rèn)存儲(chǔ)為SD卡時(shí),在DownloadProvider.java中執(zhí)行insert數(shù)據(jù)庫(kù)之前,進(jìn)行更新文件路徑。將play store傳給downloadProivder的無效路徑(storage/emulated/0 )修改為storage/sdcard1,確保存儲(chǔ)到數(shù)據(jù)庫(kù)中的地址是有效的文件路徑。

Some Tips###

  • Chrome,Play Store這些三方apk調(diào)用的都是系統(tǒng)自帶的DownLoad模塊下載數(shù)據(jù)。
  • Play Store下載apk后,自動(dòng)刪除apk
  • Downlaod記錄保存在
    /data/data/com.android.providers.downloads/databases/downloads.db,有興趣的童鞋可以push出來看一看

未完待續(xù)……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,979評(píng)論 25 709
  • 任務(wù)13 桂寶 對(duì),就是這種感覺,每次去外婆家,就是想進(jìn)入這種天然氧吧。 記得最近一次去是暑假去,一路沿著小溪走,...
    一縷桂花閱讀 239評(píng)論 0 0
  • 這是一部值得回味的電影,情節(jié)太緊湊,許多值得玩味的細(xì)節(jié)一閃就過,看后回味的樂趣要大于觀影時(shí)的樂趣。影片剛結(jié)束時(shí)影院...
    汐塵閱讀 379評(píng)論 2 2
  • 昨晚空氣潮濕,料想今天大概會(huì)下雨,早上九點(diǎn)左右,醞釀已久的雨到底下起來了。 若恰逢著一天都下雨,從早到晚便都...
    Hi梔子醬閱讀 490評(píng)論 0 0

友情鏈接更多精彩內(nèi)容