9

私のアプリでは、PDFをダウンロードするためにDownloadManagerを使用しています。これは、ダウンロードが完了すると、BroadcastReceiverを介してアプリケーションに通知します。私の問題は、BroadcastReceiverのonReceive()メソッドが2回呼び出されることです。コードは次のとおりです。

私のリストアダプタでは、選択したPDFをダウンロードするためにforループが実行されます。ダウンロードコードは、次のように別のクラスで記述されています。

    public static void downloadCheat(final SherlockFragmentActivity activity, final String cheatName, String pathOnServer){

    Request request = new Request(
            Uri.parse(ApplicationConstants.CHEAT_DOWNLOAD_SERVER_URL
                    + "/" + pathOnServer + cheatName + ".pdf"));

    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
        request.setShowRunningNotification(true);
    }
    else {
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    }

    final DownloadManager dm = (DownloadManager) activity
            .getSystemService(Context.DOWNLOAD_SERVICE);
    final long enqueue = dm.enqueue(request);

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            long i = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            System.out.println(i);
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                Query query = new Query();
                query.setFilterById(enqueue);
                Cursor c = dm.query(query);

                if (c.moveToFirst()) {
                    int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                    }
                }
                                    //create custom notification
            }
        }
    };

    activity.registerReceiver(receiver, new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

PDFのダウンロードごとに通知を追加しようとしています。これは、HoneyComb以降のバージョンのダウンロードマネージャー独自の内部通知で完全に機能しますが、GingerBreadの場合は機能しないため、独自のカスタム通知をプッシュする必要があります。したがって、PDFが完全にダウンロードされる正確な時刻を特定する必要があります。今のところ、私は自分のカスタム通知をプッシュすることができますが、通知はpdfのダウンロードごとに2回行われます(onReceive()はpdfごとに2回取得しているため)。onReceive()が2回呼び出される理由を誰かが説明できますか(PDFごとに)。これに対する回避策はありますか?また、私の場合、放送受信機の登録を解除する方法を誰かに勧めてもらえますか?上記のコードはアクティビティの一部ではないため、受信機の登録を解除する方法がわかりません。

立ち寄って投稿を読んでくれてありがとう。

4

3 に答える 3

3

通常、受信者onResume()を登録し、 で登録解除しonPause()ます。そうしていますか?


私はもともとあなたがやろうとしていることを誤解していたかもしれないと思います. unregisterReceiverから電話できるはずですonReceive。これはあなたが望むことをしますか?

于 2013-03-13T00:29:06.627 に答える
1

あなたは2つのpdfをダウンロードしていると言いました。あなたのメソッドにはダウンロード リクエストが 1 つしか表示されません。したがって、あなたがしたことは、そのメソッドを2回呼び出すことだと思います。その場合は、実際に 2 つのレシーバーを登録してACTION_DOWNLOAD_COMPLETEイベントを受信して​​います。

onCreate または onStart またはその他のメソッドで一度だけ登録する必要があります。通知目的でintent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)、ダウンロード ID を取得するために使用できます。ID はダウンロードごとに一意です。この ID を使用して、ダウンロードしたファイルに関する情報を取得し、ファイル固有の通知を行うことができます。

于 2013-03-13T01:15:33.490 に答える
1

これは、ここで説明されているのと同じバグのようです: https://code.google.com/p/android/issues/detail?id=18462

于 2013-07-31T19:58:06.753 に答える