
在之前的文章中本猿曾介紹過Android N DownloadManager中已經(jīng)采用了JobSchedule方式進(jìn)行下載任務(wù)的調(diào)度,今天就開發(fā)過程中碰到的關(guān)于JobSchedule的一點(diǎn)小坑,總結(jié)出來供大家參考分析。
想了解更多關(guān)于Android N中DownloadManager的源碼分析請點(diǎn)擊下文:
問題背景
在項(xiàng)目中,項(xiàng)目采用基于源碼修改的DownloadManager進(jìn)行下載任務(wù),而出于控制下載流量的考慮,會額外對網(wǎng)絡(luò)訪問權(quán)限進(jìn)行一定的處理。目前主要修改點(diǎn)有兩個:
- Helpers類中的scheduleJob方法,主要作用是通過schedule來喚起DownloadJobService,最終執(zhí)行下載操作。
- DownloadInfo類中的getRequiredNetworkType()方法,主要作用來返回下載任務(wù)需要的網(wǎng)絡(luò)類型。
問題描述
當(dāng)前存在的問題是對于Android 7.0的手機(jī)共享出來的熱點(diǎn),我們的下載任務(wù)一直處于等待下載狀態(tài),無法執(zhí)行。
問題結(jié)果
在前文已經(jīng)介紹過DownloadManager啟動DownloadJobService是通過Helpers.scheduleJob()方法來調(diào)度任務(wù),拉起DownloadJobService,最終完成下載功能的,
對于目前存在的問題,我們發(fā)現(xiàn)問題原因是由于scheduler.scheduleAsPackage()已經(jīng)完成了調(diào)度工作,并返回了調(diào)度值為1。但為什么沒有調(diào)用DownloadJobService呢,我們最后還是注意到我們設(shè)置的網(wǎng)絡(luò)類型:
// We always require a network, but the type of network might be further
// restricted based on download request or user override
builder.setRequiredNetworkType(info.getRequiredNetworkType(info.mTotalBytes));
我們要注意到,此處setRequiredNetworkType設(shè)置了調(diào)度任務(wù)執(zhí)行需要的網(wǎng)絡(luò)類型,而當(dāng)前DonwloadInfo連接手機(jī)熱點(diǎn)獲取的網(wǎng)絡(luò)類型為WIFI,由于需求要求控制訪問網(wǎng)絡(luò)請求的原因,所以我們對于所有網(wǎng)絡(luò)類型為WIFI的網(wǎng)絡(luò),返回的類型為JobInfo.NETWORK_TYPE_UNMETERED,即只允許訪問非計(jì)費(fèi)的網(wǎng)絡(luò)。
但是對于Android6.0與7.0版本的手機(jī),開出的熱點(diǎn)識別出的NetworkInfo中mIsMetered對象為true, 而對于普通wifi中對于mIsMetered對象為false,這個標(biāo)記值是用來標(biāo)記當(dāng)前網(wǎng)絡(luò)是否為計(jì)費(fèi)網(wǎng)絡(luò)的標(biāo)記位。對于手機(jī)網(wǎng)絡(luò)的熱點(diǎn),此處他會識別為計(jì)費(fèi)的網(wǎng)絡(luò),而對于普通通過路由分出的熱點(diǎn),會識別為非計(jì)費(fèi)的網(wǎng)絡(luò),因此針對這個問題,我們將需要的網(wǎng)絡(luò)類型設(shè)置為JobInfo.NETWORK_TYPE_ANY即可正常完成調(diào)用。
問題后記
我們從這里可以看出Android系統(tǒng)設(shè)計(jì)的細(xì)膩之處,對于訪問網(wǎng)絡(luò)更強(qiáng)大的支持可以更靈活的讓我們對手機(jī)網(wǎng)絡(luò)的訪問進(jìn)行控制。
但有個最重要的事是:對于是否為手機(jī)熱點(diǎn)還不能單純的以這個字段來判斷,因?yàn)閺腎phone上開出的熱點(diǎn),當(dāng)手機(jī)讀取的時候,這個mIsMetered對象又變成了true。
所以當(dāng)有產(chǎn)品經(jīng)理問你能不能識別當(dāng)前連接的是wifi還是手機(jī)熱點(diǎn)時,千萬別急著說可以識別哦~O(∩_∩)O哈哈
大家對于Android 網(wǎng)絡(luò)請求有什么建議和見解歡迎留言指導(dǎo)~~~