4

У меня есть 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? Что я делаю не так??

Примечание:

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

+3

Вы также должны 'LocalBroadcastManager.getInstance (это) .registerReceiver(); 'вместе с 'LocalBroadcastManager.getInstance (this) .sendBroadcast (i);' – Shaishav

+1

@Shaishav: Это сработало. Вы можете отправить его в качестве ответа; Я буду отмечать его как правильный (вы были первыми). Однако есть ли какая-то концепция, которую я здесь отсутствует? Таким образом, местная трансляция будет приниматься только через «BroadcastReceiver», зарегистрированную на местном уровне? –

+0

Да ... передача, отправленная с использованием экземпляра «LocalBroadcastManager», может быть получена только получателем, зарегистрированным с использованием экземпляра «LocalBroadcastManager». Не совсем уверен, как ответить на вопрос * почему. Кроме этого, мне нечего добавить в ответ «ρяσѕρєя K». – Shaishav

ответ

8

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

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

LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter); 
+1

Благодарим вас, но, пожалуйста, объясните, почему местная трансляция будет получена только «BroadcastReceiver», зарегистрированной локально. –

+0

@ Y.S .: Что значит «BroadcastReceiver зарегистрирован локально»? в опубликованном коде у вас просто проблема, потому что вы используете 'LocalBroadcastManager' для отправки широковещательной передачи, но действие' PERFORM_SOME_ACTION' зарегистрировано для глобальной трансляции с использованием метода ActivityReceiver. –