2013-03-13 21 views
8

私のアプリケーションでは、DownloadManagerを使用してPDFをダウンロードしています。ダウンロードが完了すると、BroadcastReceiver経由でアプリケーションに通知します。私の問題は、BroadcastReceiverのonReceive()メソッドが2回呼び出されることです。コードは次のとおりです: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()が(PDFごとに)2回呼び出されるのか説明してください。このための回避策はありますか?また、誰かが私の場合ここで放送受信機の登録を解除する方法をお勧めしますか?上記のコードはActivityの一部ではないので、受信機の登録を解除する方法がわかりません。

ありがとう、ポストを読んでくれてありがとう。

+1

がダウンロードIDその2 onReceive()の呼び出しで同じ値はありますか?ダウンロードIDはintent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID、-1) – StarPinkER

+0

で確認できます。私が2つのpdfをダウンロードするとき、ダウンロードIDはonReceiveが呼び出された最初の両方のpdfのものと同じです(first.pdf - > id = 1、second.pdf - > Id = 1)。 2回目に自動的に呼び出されると、ダウンロードIDが変更されます(first.pdf - > Id = 2、second.pdf - > id = 2)。だから基本的に私は1,1,2,2を印刷する4つの印刷ステートメントを見ます。 IDはそれぞれのPDFダウンロードで一意であるはずですか? – andro

+0

あなたのfirst.pdf-> id = 1とsecond.pdf-> id = 1について混乱しています。 – StarPinkER

答えて

3

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


私が元々あなたがしていることを誤解している可能性があります。 unregisterReceiveronReceiveに電話することができます。これはあなたが望むことをしますか?

+0

私は受信機をonResume()に登録していません。 BroadcastReceiverはダウンロードされるすべてのpdf用に作成されます。前述のように、コードは別のクラスにあり、Activityクラスの一部ではありません。私は見る。 – andro

+0

私は自分の答えを更新しました。 onReceiveからレシーバを登録解除するとどうなりますか? – yarian

+0

onReceive()の内部で受信者の登録を解除しようとすると、「受信者が登録されていません」というクラッシュが発生します。私が達成しようとしているアイデアをより詳細に知るために私の更新された質問をご覧ください。あなたの時間をありがとう。 – andro

1

あなたは2つのpdfsをダウンロードしています。あなたの方法ではダウンロードリクエストが1つしか表示されません。だから私はあなたがしたことは、そのメソッドを2回呼び出すことだと仮定します。それが本当であれば、実際にはACTION_DOWNLOAD_COMPLETEイベントを受け取る2つの受信者を登録しました。

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

+0

はい、私はこのメソッドを2回(各pdfをダウンロードするたびに)呼びました。私がこれをしたのは、各pdfごとに別々の通知を作成したいからです。単一の受信機だけを使用してこれを達成できる方法はありますか? – andro

+0

回答が更新されました。 @アンドロ – StarPinkER

関連する問題