2017-08-11 16 views
1

私はカウントダウンタイマーを持つサービスを持っています。タイマーの終了後、このサービスはブロードキャストメッセージを送信します。メッセージを送信するために次のコードを使用します:ブロードキャストメッセージの受信を防ぐ方法

Intent intent = new Intent("CancelEvents"); 
intent.putExtra("message", "cancelled"); 
LocalBroadcastManager.getInstance(TimerClass.this).sendBroadcast(intent); 

私はブロードキャストレシーバーを備えた別のアクティビティを持っています。これは、ブロードキャストメッセージを受信するために使用したコードです。

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(cancelReceiver, 
      new IntentFilter("CancelEvents")); 
} 

private BroadcastReceiver cancelReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     String message = intent.getStringExtra("message"); 

     if (message.equals("cancelled")) 
     { 
      Toast.makeText(this, 
        "Your Ride Got Cancelled", Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 

受信は問題ありません。しかし問題は、受信者がいない他のすべての活動でもメッセージが受信されることです。これをやめる方法は? onStopにあなたがのonCreate()でcancelReceiverを登録している活動での活動の()コールバックを定義することによって、あなたの放送の登録を解除し

+0

独自のインテントフィルタを使用します。 – kulvinder

+0

"しかし問題は、受信者がいない他のすべての活動でもメッセージが受信されることです。" - それが意味することを正確に説明してください。レシーバなしで他のコンポーネントがどのように放送を受信するのですか? –

+0

開業しているすべてのアクティビティにトーストが表示されます –

答えて

1

は、あなたのライフサイクルの別の部分にブロードキャスト購読コードを移動します。

@Override 
protected void onStart() 
{ 
    super.onStart(); 
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(cancelReceiver, 
        new IntentFilter("CancelEvents")); 
     } 

@Override 
    public void onStop() { 
     super.onStop(); 
     LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(cancelReceiver); 
    } 

説明:バックグラウンドで中にあなたの活動が、それはまだ加入している、とトーストメッセージではなく、他の活動を示しています。

+0

私はその活動がバックグラウンドにあるとは思わない。私は 'this.finish()'を使ってその活動から抜け出します。 –

+1

問題ではありません。 'cancelReceiver'は匿名クラスであり、アクティビティへの参照を保持しているので、まだ終了状態です。実際には、あなたの現在のコードもアクティビティをリークします。私が提案したように、onCreateからonStartへサブスクリプションを移動してみてください。 – theFunkyEngineer

+0

ありがとう..それは働いた –

1

...

@Override 
    public void onStop() { 
     super.onStop(); 
     LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(cancelReceiver); 
    } 
+0

** onCreate()**で登録すると、登録を解除する場所が** onDestroy()**になります。 –

+0

@MuthukrishnanRajendranあなたがあなたの放送を登録した活動が破壊されず、別の活動がその活動に来る場合、放送局はまた、彼が直面している問題を発砲します。 –

+0

この場合、onStart()に登録してonStop()で登録を解除する必要があります。onCreateに登録してonStop()に登録しないでください。あなたのシナリオを取ることができます。onStopで登録を解除し、その場合、私たちはこの画面にいても、すでに登録を解除しているため、何も取得しません。 –

関連する問題