ROM开发 系统下载应用开发

一、下载列表数据的分块显示

下载文件内容的数据库查询需要用到frameworks\base\core\java\android\app目录下的DownloadManager.java类,若要下载的列表数据分块显示,如:让处于正在下载状态的下载文件处于下载列表项前面,下载完毕或者下载失败的文件处于列表项后面,即分为两部分显示。在所操作的Query类中添加根据下载状态分类显示查询的Boolean值设置操作函数:

private booleanmIsSortByDownloadingStateAndDate = false;

/**

 * setSortByDownloadingStateAndDate: TODO<br/>

 *

 * @param pValue boolean

 * @hide

 */   

 public voidsetSortByDownloadingStateAndDate(boolean pValue) {

         mIsSortByDownloadingStateAndDate = pValue;

 }

    

在runQuery(ContentResolverresolver, String[] projection, Uri baseUri)函数中修改orderBy赋值逻辑:

if (mIsSortByDownloadingStateAndDate) {

    orderBy = COLUMN_STATUS + " ASC, " + Downloads.Impl.COLUMN_LAST_MODIFICATION + " DESC";

    }

        优先根据下载状态值排序,再根据下载文件的时间来排序。


二、下载的暂停和继续


下载页面列表数据的显示是直接从下载数据库中查询得到,在DownloadProviderUI工程中只是数据库数据在UI上的呈现,下载的实际后台逻辑处理在DownloadProvider工程中。处于下载状态中的下载暂停和控制都是改变数据库中的数据,并没有与DownloadProvider后台服务进行直接的交互。

    1、暂停下载是将数据库中Downloads.Impl.COLUMN_CONTROL字段值置为Downloads.Impl.CONTROL_PAUSED。逻辑代码如下:

   final Uri uri = ContentUris.withAppendedId( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,mId);

        final ContentValues values = new ContentValues();

        values.put(Downloads.Impl.COLUMN_CONTROL,Downloads.Impl.CONTROL_PAUSED);

        getContentResolver().update(uri, values, null, null);

   2、 继续下载是更新Downloads.Impl.COLUMN_CONTROL字段值为Downloads.Impl.CONTROL_RUN,且需将Downloads.Impl.COLUMN_STATUS字段值设置为Downloads.Impl.STATUS_RUNNING。逻辑代码如下:

        final Uri uri = ContentUris.withAppendedId( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,mId);

        final ContentValues values = new ContentValues();

        values.put(Downloads.Impl.COLUMN_CONTROL, Downloads.Impl.CONTROL_RUN);

        values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_RUNNING);

        getContentResolver().update(uri,values, null,null);



三、原生系统下载的Bug


原生系统下载服务会在当前没有继续下载任务的时候直接停止下载服务,这样会导致后续的下载暂停和继续的控制无法进行,在停止下载服务的操作之前需要添加是否有暂停的下载任务的判断。

        //   添加此判断
                if(!hasPauseTask()){
                //
         
        if (stopSelfResult(startId)) {
                    if (DEBUG_LIFECYCLE) Log.v(TAG, "Nothing left; stopped");
                    getContentResolver().unregisterContentObserver(mObserver);
                 
    mScanner.shutdown();
                   
    mUpdateThread.quit();
             
       }
                }
   


 private boolean hasPauseTask() {
        final ContentResolver resolver = getContentResolver();
        final Cursor cursor = resolver.query(
                Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, null, null, null,
                null);
        try{
            if (cursor != null && cursor.moveToFirst()) {
                for (int i = 0; i < cursor.getCount(); i++) {
                    int status = cursor.getInt(cursor
                            .getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                    if (status < Downloads.Impl.STATUS_SUCCESS) {
                        return true;
                    }
                    cursor.moveToNext();
                }
            }
        }finally{
            if(cursor!=null){
                cursor.close();
            }
        }
        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值