代码之家  ›  专栏  ›  技术社区  ›  user782104

在一个活动中设置两个具有相同意图的广播接收器

  •  0
  • user782104  · 技术社区  · 9 年前

    一个活动中有两个下载管理器,我注册了两个不同的广播接收器,目的相同。

    问题是,没有什么像“请求代码”一样的东西,而且两个接收器似乎重叠,有时触发第一个,有时触发第二个。

    mgr = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
                            ctx.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                            mgr.enqueue(request);
    
    mgr = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
                            ctx.registerReceiver(onImgComplete , new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                            mgr.enqueue(request);
    
        onComplete = new BroadcastReceiver() {
            public void onReceive(Context ctxt, Intent intent) {
                pDialog.dismiss();
                play();
            }
        };
    
        onImgComplete = new BroadcastReceiver() {
            public void onReceive(Context ctxt, Intent intent) {
                pDialog.dismiss();
                Intent emailIntent = new Intent(Intent.ACTION_SEND); 
                emailIntent.setType("image/jpeg");
                emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{});    
                emailIntent.putExtra(Intent.EXTRA_SUBJECT, intent_type_string +" - " + item.name);
                emailIntent.putExtra(Intent.EXTRA_TEXT, intent_msg + "\nDownload EasyFind:\nhttp://yahoo.com.hk");
                emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tmp_img));
                startActivity(emailIntent);
            }
        };
    

    我怎样才能把它们分开?

    1 回复  |  直到 3 年前
        1
  •  1
  •   dev.bmax    9 年前

    你可以只注册一个接收者。在它的onReceive方法中,intent参数应该有一个长的额外值,其下载ID为:

    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
    

    这是开始下载时应保存的ID:

    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    Request request = new Request(Uri.parse("YOUR_LINK"));
    long queueID = dm.enqueue(request);
    

    接下来,您可以提取有关下载文件的必要数据:

    Query query = new Query();
    query.setFilterById(queueID);
    Cursor c = dm.query(query);
    if (c.moveToFirst()) {
        String uriString = c.getString(
            c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
        String mediaType = c.getString(
            c.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE));
        //TODO IMPLEMENT
    }
    

    注意:使用的查询是DownloadManager.Query