你的位置:首页 > 软件开发 > 操作系统 > DownloadProvider调试

DownloadProvider调试

发布时间:2015-11-20 20:00:06
由于身边的同事离职,最近又接手了一个模块,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 (#换成@)。

可能感兴趣文章

我的浏览记录