2017-08-11 151 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(); 
     } 
    } 
}; 

接收工作正常。但是,問題在於所有其他活動也收到了沒有接收器的消息。如何阻止此?

+0

使用唯一意圖過濾器。 – kulvinder

+0

「但是,問題在於所有其他活動也收到了沒有接收器的消息。」 - 請詳細解釋這意味着什麼。其他組件如何在沒有Receiver的情況下接收廣播? –

+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'是一個匿名類,並維護對你的Activity的引用,所以它仍然存在,處於完成狀態。實際上,你當前的代碼也會泄露Activity。嘗試按我的建議,將訂閱從onCreate移動到onStart。 – theFunkyEngineer

+0

謝謝..它的工作 –

1

註銷通過的onStop定義在其中活動已在的onCreate()註冊cancelReceiver活動()回調的廣播......

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

如果我們在** onCreate()**中註冊,那麼取消註冊的更好的地方是** onDestroy()**。 –

+0

@MuthukrishnanRajendran如果您註冊廣播的活動沒有被破壞,並且另一項活動出現在該活動上,那麼廣播也將觸發這是他面臨的問題。 –

+0

在這種情況下,我們應該在onStart()中註冊並在onStop()中註銷,我們不應該在onCreate中註冊並在onStop()中取消註冊,我們可以帶上您的senario,我們在onStop中取消註冊並返回到同一活動,在這種情況下,即使我們在這個屏幕上,我們也不會得到任何東西,因爲我們已經註銷了。 –