Трансляция получена дважды - программирование
Подтвердить что ты не робот

Трансляция получена дважды

Я использую локальную широковещательную рассылку, чтобы моя служба узнала, что AsyncTask завершил свою работу, но у меня есть небольшая проблема: широковещательная передача отправляется только один раз (она создается функцией, которая вызывается только при запуске приложения), но я получаю его дважды.

упрощенный код:

@Override
protected void onPostExecute(HttpResponse result) {
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getBaseContext());
    localBroadcastManager.sendBroadcast(new Intent(getString(R.string.bc_CONNECTED)));
}

в сервисе:

private BroadcastReceiver connectedBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(getString(R.string.app_tag), "broadcast received !!");
    }
};

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    LocalBroadcastManager.getInstance(this).registerReceiver(connectedBroadcastReceiver, new IntentFilter(getString(R.string.bc_CONNECTED)));
    return START_STICKY;
}

Кто-нибудь сталкивался с таким странным поведением?

4b9b3361

Ответ 1

Вы должны всегда проверять намерение Действие перед ответом на трансляцию.

public void onReceive(Context context, Intent intent){
      if(intent.getAction() != null && intent.getAction().equals(getString(R.string.bc_CONNECTED))){
      Log.d(getString(R.string.app_tag), "broadcast received !!");
 }
}

Проверьте документацию. В нем говорится, что вы можете получать ложные звонки. Поэтому всегда проверяйте действие

Фильтры Intent, используемые в registerReceiver (BroadcastReceiver, IntentFilter), а в манифесте приложения не гарантируется эксклюзив. Они указывают на операционную систему о том, как найти подходящих получателей. Для отправителей можно отправить определенных получателей, минуя разрешение фильтра. По этой причине, onReceive() должны реагировать только на известные действия, игнорируя любые неожиданные намерения, которые они могут получить.

Ответ 2

У меня была такая же проблема, проблема заключалась в том, что я регистрировал получателя в методе onCreate и в методе onResume. Удаление из onCreate проблема была решена.

Ответ 3

У меня была эта проблема, потому что я регистрировался дважды, так как у меня были два намеренных фильтра. Таким образом, система дважды выполняла одно и то же намерение.

  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterNews);
  LocalBroadcastManager.getInstance(this).registerReceiver(mLocalReceiver,intentFilterWeather);

Ответ 4

Вы отменили регистрацию получателя при выходе из приложения? В противном случае вы получите с каждым приложением запуск другого зарегистрированного получателя. Или вы должны проверить, был ли приемник уже зарегистрирован в предыдущем вызове приложения, прежде чем вы зарегистрируете его.