由于身边的同事离职,最近又接手了一个模块,DownloadProvider, 也就是安卓中自带的下载管理。此模块的代码量比较少,但是最近阅读代码却发现还是由不少知识点的。之前同事在此模块做了一个关于DRM的需求,查看了一下其代码修改量也是比较大的,最近需要进行ROM移植,发现直接 ...
由于身边的同事离职,最近又接手了一个模块,DownloadProvider, 也就是安卓中自带的下载管理。此模块的代码量比较少,但是最近阅读代码却发现还是由不少知识点的。之前同事在此模块做了一个关于DRM的需求,查看了一下其代码修改量也是比较大的,最近需要进行ROM移植,发现直接看此部分代码不知所云。
为了能够实现后期顺利移植改功能,首先需要对此模块的整体流程有个比较清晰的认识。于是在项目其他问题还比较少的最近两天,开始断断续续地调试代码,增加log,查看其运行流程。
首先看清单文件AndroidManifest.
android:protectionLevel="signatureOrSystem"也许也正是因为此,外部调用下载需要使用DownloadManager来进行,因此在刚开始时也从网络上查找了使用接口来进行下载的方法,基本就三点:3、加入下载队列此部分代码是放在拨号盘中进行调试,然后编译的,单独编译的apk需要和系统相同的签名才可以正常下载,这个没有尝试, 但是将downloadProvider中的权限都改为normal,以及注释掉插入数据库时的权限检查后都没有能成功下载,还是会报权限问题。
public Uri insert(final Uri uri, final ContentValues values) {
long rowID = db.insert(DB_TABLE, null, filteredValues);--插入数据库 downloads 表
insertRequestHeaders(db, rowID, values);---插入头信息到数据库 request_headers表
notifyContentChanged(uri, match);---通知数据库变化,刚开始感觉此处没什么卵用,因为监听还没注册,这个是在服务中进行的,后来才知道开机启动后,服务就已经创建了。
context.startService(new Intent(context, DownloadService.class)); ---启动服务
public void onCreate() { if (mSystemFacade == null) { mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); mUpdateThread = new HandlerThread(TAG + "-UpdateThread"); mScanner = new DownloadScanner(this);---跟文件扫描相关的,没怎么关注 mNotifier = new DownloadNotifier(this);---通知栏相关 mObserver = new DownloadManagerContentObserver(); }
mLastStartId = startId;
private Handler.Callback mUpdateCallback = new Handler.Callback() { final int startId = msg.arg1; final boolean isActive; if (msg.what == MSG_FINAL_UPDATE) { // Dump speed and update details Log.wtf(TAG, "Final update pass triggered, isActive=" + isActive if (isActive) { // Enqueue delayed update pass to catch finished operations that } else { if (stopSelfResult(startId)) { return true; boolean isActive = false; final Set<Long> staleIds = Sets.newHashSet(mDownloads.keySet()); final ContentResolver resolver = getContentResolver(); try { if (info.mDeleted) {---如果标记为删除的,则删除文件和数据库记录 deleteFileIfExists(info.mFileName); } else {---否则启动下载 // Kick off media scan if completed // Keep track of nearest next action // Clean up stale downloads that disappeared // Update notifications visible to user return isActive;
public boolean startDownloadIfReady(ExecutorService executor) { if (isReady && !isActive) { mTask = new DownloadThread(mContext, mSystemFacade, mNotifier, this);
3、下载线程DownloadThread
public void run() { executeDownload();---执行下载 }
private void executeDownload() throws StopRequestException {
switch (responseCode) {有时候山重水复疑无路,但是换个思维想想就会柳暗花明又一村。
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:DownloadProvider调试
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。