Как использовать LocalBroadcastManager? - PullRequest
425 голосов
/ 10 января 2012

Как использовать / найти LocalBroadcastManager, как описано в Документы Google и Сервис трансляции документов ?

Я пытался Google, но нет кодадоступно для начала?

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

Любойпомощь / комментарий?

Обновление : я знаю, как использовать трансляции, но не знаю, как сделать LocalBroadcastManager доступным в моем проекте.

Ответы [ 9 ]

820 голосов
/ 16 января 2012

Я все равно отвечу на это.На всякий случай, если это кому-то нужно.

ReceiverActivity.java

Действие, которое ищет уведомления для события с именем "custom-event-name".

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

SenderActivity.java

Второе действиеотправляет / передает уведомления.

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Every time a button is clicked, we want to broadcast a notification.
  findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendMessage();
    }
  });
}

// Send an Intent with an action named "custom-event-name". The Intent sent should 
// be received by the ReceiverActivity.
private void sendMessage() {
  Log.d("sender", "Broadcasting message");
  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "This is my message!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

С кодом выше, каждый раз, когда нажимается кнопка R.id.button_send, намерение транслируется и принимается mMessageReceiver в ReceiverActivity.

Вывод отладки должен выглядеть следующим образом:

01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message! 
125 голосов
/ 26 апреля 2012

Я бы предпочел ответить всесторонне.

  1. LocalbroadcastManager включен в Android 3.0 и выше, поэтому вы должны использовать библиотеку поддержки v4 для ранних выпусков.см. инструкции здесь

  2. Создание приемника вещания:

    private BroadcastReceiver onNotice= new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // intent can contain anydata
            Log.d("sohail","onReceive called");
            tv.setText("Broadcast received !");
    
        }
    };
    
  3. Зарегистрируйте получателя в onResume деятельности, например:

    protected void onResume() {
            super.onResume();
    
            IntentFilter iff= new IntentFilter(MyIntentService.ACTION);
            LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff);
        }
    
    //MyIntentService.ACTION is just a public static string defined in MyIntentService.
    
  4. отменить регистрацию получателя в onPause:

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
    
  5. Теперь, когда локальная широковещательная рассылка отправляется из активности или службы приложений, onReceive ofonNotice будет вызываться:).

Редактировать: полное руководство можно прочитать здесь LocalBroadcastManager: передача сообщений внутри приложения

36 голосов
/ 18 ноября 2016

В конце получения:

  • Первый регистр LocalBroadcast Receiver
  • Затем обработайте входящие данные о намерениях в onReceive.

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
          lbm.registerReceiver(receiver, new IntentFilter("filter_string"));
      }
    
      public BroadcastReceiver receiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              if (intent != null) {
                  String str = intent.getStringExtra("key");
                  // get all your data from intent and do what you want 
              }
          }
      };
    

В конце отправки:

   Intent intent = new Intent("filter_string");
   intent.putExtra("key", "My Data");
   // put your all data using put extra 

   LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
27 голосов
/ 17 февраля 2012

В Eclipse, в конце концов, мне пришлось добавить Библиотека совместимости / поддержки , щелкнув правой кнопкой мыши по моему проекту и выбрав:

Инструменты Android -> Добавить библиотеку поддержки

Как только он был добавлен, я смог использовать класс LocalBroadcastManager в своем коде.


Android Compatibility Library

9 голосов
/ 02 марта 2018

Как изменить глобальную трансляцию на LocalBroadcast

1) Создать экземпляр

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2) Для регистрации BroadcastReceiver

Заменить

registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

С

localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

3) Для отправки широковещательного сообщения

Заменить

sendBroadcast(intent);

С

localBroadcastManager.sendBroadcast(intent);

4) Для отмены регистрации широковещательного сообщения

Заменить

unregisterReceiver(mybroadcast);

С

localBroadcastManager.unregisterReceiver(mybroadcast);
6 голосов
/ 19 января 2019

androidx.localbroadcastmanager устарела в версии 1.1.0

Причина

LocalBroadcastManager являетсяшина событий всего приложения и охватывает нарушения уровня в вашем приложении;любой компонент может прослушивать события от любого другого компонента.Он наследует ненужные ограничения варианта использования системы BroadcastManager;разработчики должны использовать Intent, даже если объекты живут только в одном процессе и никогда не покидают его.По этой же причине он не следует по функциональным возможностям BroadcastManager.

Это приводит к сбивающему с толку опыту разработчика.

Замена

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

Преимущество LiveData

Вы можете расширить LiveData объект, использующий шаблон синглтона, чтобы обернуть системные службы, чтобы их можно было использовать в вашем приложении.Объект LiveData подключается к системной службе один раз, и тогда любой наблюдатель, которому нужен ресурс, может просто наблюдать за объектом LiveData.

 public class MyFragment extends Fragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        LiveData<BigDecimal> myPriceListener = ...;
        myPriceListener.observe(this, price -> {
            // Update the UI.
        });
    }
}

Метод observe() передает фрагмент, который является экземпляром LifecycleOwner, в качестве первого аргумента.Это означает, что этот наблюдатель привязан к объекту Lifecycle, связанному с владельцем, что означает:

  • Если объект жизненного цикла не находится в активном состоянии, то наблюдатель невызывается даже при изменении значения.

  • После уничтожения объекта жизненного цикла наблюдатель автоматически удаляется

Тот факт, что LiveData объектыпонимание жизненного цикла означает, что вы можете делиться ими между несколькими действиями, фрагментами и службами.

4 голосов
/ 08 августа 2016

Когда вы будете достаточно играть с LocalBroadcastReceiver, я предложу вам попробовать Green Robot EventBus - вы обязательно поймете разницу и полезность этого по сравнению с LBR.Меньше кода, настраиваемый для потока получателя (UI / Bg), проверка доступности получателей, липкие события, события могут быть использованы для доставки данных и т. Д.

2 голосов
/ 14 июня 2012

Пример Activity и Сервиса, реализующих LocalBroadcastManager, можно найти в разработчику docs . Я лично нашел это очень полезным.

РЕДАКТИРОВАТЬ: с тех пор ссылка была удалена с сайта, но данные следующие: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master/support4demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java

0 голосов
/ 22 июня 2016

мы также можем использовать интерфейс для того же, что и broadcastManger, здесь я делюсь кодом testd для broadcastManager, но по интерфейсу.

сначала создайте такой интерфейс:первый класс, который нуждается в реализации

public class First implements MyInterface{

    MyInterface interfc;    
    public static void main(String[] args) {
      First f=new First();      
      Second s=new Second();
      f.initIterface(s);
      f.GetName("Paddy");
  }
  private void initIterface(MyInterface interfc){
    this.interfc=interfc;
  }
  public void GetName(String name) {
    System.out.println("first "+name);
    interfc.GetName(name);  
  }
}

3-здесь - это второй класс, который реализует тот же интерфейс, чей метод автоматически вызывает

public class Second implements MyInterface{
   public void GetName(String name) {
     System.out.println("Second"+name);
   }
}

, поэтому при таком подходе мы можем использовать интерфейсфункционирует так же, как broadcastManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...