Локальная трансляция от Сервиса не получена Activity

У меня есть Activity, в котором я регистрирую BroadcastReceiver локально следующим образом:

public class SomeActivity extends Activity{

    public static final String PERFORM_SOME_ACTION = "PERFORM_SOME_ACTION";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.some_activity_layout);

        .....
        .....

        IntentFilter filter = new IntentFilter();
        filter.addAction(PERFORM_SOME_ACTION);

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // perform some action ...
            }
        };

        registerReceiver(receiver, filter);
    }

    .....
    .....
}

И у меня есть Service, из которого я транслирую Intent следующим образом:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {        

    Intent i = new Intent(SomeActivity.PERFORM_SOME_ACTION);
    sendBroadcast(i);   /* Send global broadcast. */

    return START_STICKY;
}

Это работает по назначению. После реализации этого я понял, что локальная трансляция была бы более подходящей для этой ситуации:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {        

    Intent i = new Intent(SomeActivity.PERFORM_SOME_ACTION);
    LocalBroadcastManager.getInstance(this).sendBroadcast(i);   /* Send local broadcast. */

    return START_STICKY;
}

К сожалению, описанная выше схема не работает. Глобальная широковещательная рассылка отправляется каждый раз, в то время как локальная широковещательная рассылка, по-видимому, никогда не отправляется/не принимается.

Что мне здесь не хватает? Нельзя ли отправлять локальные широковещательные сообщения между двумя отдельными компонентами приложения, например двумя отдельными Activity или между Service и Activity? Что я делаю не так??

Примечание.

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


comment
Вам также нужно LocalBroadcastManager.getInstance(this).registerReceiver(); вместе с LocalBroadcastManager.getInstance(this).sendBroadcast(i);   -  person Shaishav    schedule 26.08.2016
comment
@Shaishav: Это сработало. Вы можете опубликовать это как ответ; Я отмечу его как правильный (вы были первым). Однако есть ли какая-то концепция, которую мне здесь не хватает? Значит, локальная трансляция будет приниматься только BroadcastReceiver зарегистрированным локально?   -  person Y.S    schedule 26.08.2016
comment
Да... широковещательная рассылка, отправленная с использованием экземпляра LocalBroadcastManager, может быть получена только получателем, зарегистрированным с использованием экземпляра LocalBroadcastManager. Не совсем уверен, как ответить на вопрос почему. Кроме этого, мне действительно нечего добавить к ответу «ρяσѕρєя К».   -  person Shaishav    schedule 26.08.2016
comment
У меня была та же проблема, что и у OP, потому что я звонил setData(myUri) в свое широковещательное намерение. Кроме того, возможно, стоит проверить объекты контекста, которые вы используете для регистрации получателей/отправки широковещательных намерений.   -  person ban-geoengineering    schedule 18.01.2017
comment
@ban-geoengineering: Не могли бы вы уточнить последнее предложение? Вы имеете в виду, что если вы используете контекст активности для регистрации получателя, но используете контекст приложения для отправки трансляции, получатель может не получить трансляцию?   -  person LarsH    schedule 12.07.2017
comment
@LarsH Да, это то, что я имел в виду. Я не уверен, так это или нет, но это одна из вещей, которые я рассматривал как возможность, прежде чем обнаружил, что setData(myUri) на самом деле была моей проблемой, поэтому я не стал исследовать эту идею дальше. Но вы должны иметь возможность достаточно легко проверить, используя getApplicationContext() (или что-то еще) с обеих сторон. (Я просто подумал, что выкину его на случай, если есть шанс, что он может помочь кому-то еще.)   -  person ban-geoengineering    schedule 12.07.2017
comment
@ban-geoengineering: Спасибо. Когда я столкнулся с похожей проблемой (stackoverflow.com/questions/45064518/), я попытался использовать getApplicationContext() из-за вашего предыдущего комментария. В моем случае не помогло.   -  person LarsH    schedule 12.07.2017


Ответы (1)


Что мне здесь не хватает?

Используйте LocalBroadcastManager для регистрации LocalBroadcast, в настоящее время используется метод Activity registerReceiver, который используется для регистрации глобального Broadcast:

LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
person ρяσѕρєя K    schedule 26.08.2016
comment
Спасибо, но, пожалуйста, объясните, почему локальная трансляция может быть получена только BroadcastReceiver зарегистрированным локально. - person Y.S; 26.08.2016
comment
@Y.S.: Что вы имеете в виду под BroadcastReceiver registered locally? в опубликованном коде у вас просто проблема, потому что вы используете LocalBroadcastManager для отправки трансляции, но PERFORM_SOME_ACTION действие зарегистрировано для глобальной трансляции с использованием метода registerReceiver действия. - person ρяσѕρєя K; 26.08.2016