У меня есть 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
? Что я делаю не так??
Примечание.
Согласно документации, это более эффективно и более до такой степени, чтобы отправлять локальную широковещательную рассылку (трансляцию внутри приложения, область действия которой ограничена собственными компонентами приложения), а не глобальную широковещательную рассылку (трансляция между приложениями, которая передается каждому отдельному приложению на телефоне) всякий раз, когда нам не нужно, чтобы трансляция распространялась за пределы приложения. Это является причиной внесения вышеупомянутого изменения.
LocalBroadcastManager.getInstance(this).registerReceiver();
вместе сLocalBroadcastManager.getInstance(this).sendBroadcast(i);
- person Shaishav   schedule 26.08.2016BroadcastReceiver
зарегистрированным локально? - person Y.S   schedule 26.08.2016LocalBroadcastManager
, может быть получена только получателем, зарегистрированным с использованием экземпляраLocalBroadcastManager
. Не совсем уверен, как ответить на вопрос почему. Кроме этого, мне действительно нечего добавить к ответу «ρяσѕρєя К». - person Shaishav   schedule 26.08.2016setData(myUri)
в свое широковещательное намерение. Кроме того, возможно, стоит проверить объекты контекста, которые вы используете для регистрации получателей/отправки широковещательных намерений. - person ban-geoengineering   schedule 18.01.2017setData(myUri)
на самом деле была моей проблемой, поэтому я не стал исследовать эту идею дальше. Но вы должны иметь возможность достаточно легко проверить, используяgetApplicationContext()
(или что-то еще) с обеих сторон. (Я просто подумал, что выкину его на случай, если есть шанс, что он может помочь кому-то еще.) - person ban-geoengineering   schedule 12.07.2017getApplicationContext()
из-за вашего предыдущего комментария. В моем случае не помогло. - person LarsH   schedule 12.07.2017