Как использовать LocalBroadcastManager?

Как использовать/найти LocalBroadcastManager, как описано в google docs и Служба широковещательного документа?

Я попытался это сделать, но нет кода, который можно начать с?

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

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

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

Ответ 1

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

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, Intent транслируется и принимается 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! 

Ответ 2

Я хотел бы ответить всесторонне.

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

  • Создайте широковещательный приемник:

    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 !");
    
        }
    };
    
  • Зарегистрируйте свой приемник в 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.
    
  • unRegister приемник в onPause:

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

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

Ответ 3

В конце приема:

  • Первый регистр 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);

Ответ 4

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

Android Tools Add Support Library

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


Android Compatibility Library

Ответ 5

Как изменить глобальную трансляцию на 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

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 учитывают жизненный цикл, означает, что вы можете делиться ими между несколькими действиями, фрагментами и сервисами.

Ответ 7

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

Ответ 10

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

сначала создайте интерфейс вроде:

public interface MyInterface {
     void GetName(String name);
}

2-это первый класс, который нуждается в реализации

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.