1.监听下载任务状态

为了监听自身创建的下载任务,可以通过创建 ContentObserver 来 监听DownloadProvider

        mContext.getContentResolver().registerContentObserver(                Downloads.Impl.CONTENT_URI, true, mDownloadManagerObserver);

其中

        public static final Uri CONTENT_URI =                Uri.parse("content://downloads/my_downloads");

使用这个可以监听到当前应用创建的下载任务。另外还有ALL_DOWNLOADS_CONTENT_URI可以监听到所有的下载任务,不过也需要相应的ACCESS_ALL_DOWNLOADS权限才行。

第二个参数,表示是否监听派生的URL。false的时候,则精确匹配URL,才会通知。true的话,类似content://downloads/my_downloads/3 这种url时也会通知

第三个参数则是自己继承实现的 ContentObserver ,需要Handler作为参数

    private class DownloadManagerObserver extends ContentObserver {        public DownloadManagerObserver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange) {            updateDownloadState();        }    }

2.下载任务状态

可以监听下载任务后,需要根据对应的下载状态,来进行不同操作或提示。
状态情况如下,如字面意思:
STATUS_PENDING
STATUS_RUNNING
STATUS_PAUSED
STATUS_SUCCESSFUL
STATUS_FAILED

关于状态获取,有两种方法:

一种就是标准的,通过DownloadManager提供的方法来查询:

        DownloadManager.Query query = new DownloadManager.Query();        query.setFilterById(id);        Cursor cursor = mDownloadManager.query(query);        try {            if (cursor != null && cursor.moveToFirst()) {                ret[0] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));                ret[1] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON));                ret2[0] = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));                ret2[1] = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (cursor != null) {                    cursor.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }

提供ID,可以查询该任务的详细状态,如Status,失败时的Reason,已下载大小COLUMN_BYTES_DOWNLOADED_SO_FAR,总大小COLUMN_TOTAL_SIZE_BYTES

该方法可以返回DownloadManager经过处理,允许暴露的一些属性

不过如果直接把DownloadProvider从手机中导出来查看的话,可以发现其中还有很多还未查到的属性。比如存了任务失败详细信息的ErrorMsg字段

这时候需要用到第二种方法,直接去查询DownloadProvider:

            Uri uri = ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, id);            Cursor cursor = mContext.getContentResolver().query(uri,                new String[] {Downloads.Impl.COLUMN_ERROR_MSG},                null, null, null);            if (cursor != null) {                try {                    if (cursor.getCount() > 0) {                        cursor.moveToFirst();                        result[1] = cursor.getString(cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_ERROR_MSG));                        result[0] = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_SERVER_IP));                    }                } catch (IllegalArgumentException e) {                    Log.e(TAG, "column does not exist: ");                } finally {                    cursor.close();                }            }

主要是query的参数不太一样,除了第一个uri外,第二个参数为projection,表示需要查询返回的列,如果为null的话,则会返回所有列(其实只会返回部分,下载管理之外的程序访问时,只会返回部分,比如想获取的ErrorMsg就不给。但是如果你在projection直接声明需要返回的列,则可以返回,而且效率更高),第三个selection第四个参数selectionArgs为常见的查询参数,第五个sortOrder为是否需要排序。
通过该方法,我们可以获得更详细的一些属性。

更多相关文章

  1. android的属性动画
  2. 【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI
  3. Android Studio属性学习(一)——shape属性
  4. Android中使用tint属性和backgroundTint属性瘦身
  5. 利用BeautifulSoup的find_all()函数查找某个标签且该标签某属性
  6. Android—— Android 的属性系统

随机推荐

  1. android 按两次返回键强制退出整个APP
  2. 说说 mvc 模式的原理,它在 android 中的运
  3. Android中图片压缩分析(上)
  4. Android系统的体系结构、开发语言及源码
  5. Github项目解析(二)-->将Android项目发布至
  6. 工具篇 之 Android(安卓)WIFI ADB 实战
  7. Android进程注入
  8. Google Cloud Messaging (Android 消息推
  9. 关于Android直接连MySQL获取数据的真机测
  10. Android字体资源