2017-08-11 155 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中取消注册并返回到同一活动,在这种情况下,即使我们在这个屏幕上,我们也不会得到任何东西,因为我们已经注销了。 –