LocalBroadcastManager nasıl kullanılır?


452

Google dokümanlarında ve Hizmet yayını dokümanındaLocalBroadcastManager açıklandığı gibi nasıl kullanılır / bulunur ?

Google'ı denemeye çalıştım, ancak başlamak için herhangi bir kod yok mu?

Belgeler, uygulamamın sürecinde dahili olarak yayın yapmak istiyorsam kullanmam gerektiğini söylüyor, ancak bunu nerede arayacağımı bilmiyorum.

Herhangi bir yardım / yorum var mı?

Güncelleme : Yayınları nasıl kullanacağımı biliyorum, ancak LocalBroadcastManagerprojeme nasıl ulaşacağımı bilmiyorum .


Waqas, alıcıyı manifestoda kaydettiniz mi? Evet ise, lütfen bana nasıl olduğunu bildirin.
Mudassir

2
Bu tür yayınlar için alıcıyı manifest olarak kaydetmeniz gerektiğini düşünmüyorum, çünkü eğer yaparsanız, o alıcı global yayınları da dinleyecektir.
waqaslam

2
Doğru. Sonra bu, aşağıdaki cevap verilen kodda yapmak zorunda anlamına gelir; LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
Mudassir

2
LocalBroadcastManager, kullanımdan kaldırıldı. Benimkini çok daha güzel olan EventBus kütüphanesiyle değiştirdim, imo.
Kris B

Yanıtlar:


862

Buna yine de cevap vereceğim. Birisinin ihtiyacı olması durumunda.

ReceiverActivity.java

Adlı etkinliğe ilişkin bildirimleri izleyen bir etkinlik "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

Bildirim gönderen / yayınlayan ikinci etkinlik.

@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);
}

Düğme her zaman, yukarıdaki kod ile R.id.button_sendtıklandığında, bir Niyet yayınlanan ve tarafından alındığı mMessageReceiveryer ReceiverActivity.

Hata ayıklama çıktısı şöyle görünmelidir:

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! 

7
Teşekkürler. zaten çalışıyor. ama karşılaştığım sorun LocalBroadcastManager sınıfında tutmak oldu. Bir destek paketi sınıfı olduğundan, Android Araçları'ndan Uyumluluk Kütüphanesi ekleyene kadar sıradan paketimde kullanamadım. Bir kez eklendi, hepsi iyi gitti. neyse, cevap için teşekkürler
waqaslam

195
Lütfen onDestroy()çağrılması garanti edilmez !!! Kullanmalısınız onPause()(sadece onPause()garantili olduğu için) ve onResume()(eşleştiği için onPause())
18446744073709551615

5
Millet, google dokümanlarının şimdi onPause () sonrası bir Etkinlik hakkında ne söylediğine dikkat edin: Killable = Pre-HONEYCOMB Honeycomb ile başlayarak, bir uygulama onStop () geri dönünceye kadar killable durumunda değildir.
18446744073709551615

59
onDestroy()sorun yok. Çağrılmadığı durum, uygulamanın öldürüldüğü zamandır ve kayıtlı alıcıların listesi bile hayatta kalamadığı için bu durumda kayıt olmamanız önemli değildir.
zapl

4
@Selvin Umarım BroadcastReciever'ı alma etkinliğine zayıf bir şekilde başvurabilir ve yetim kalmışsa kendisini silebilirsiniz. OnPause'da kaydını silmenize gerek yok, onDestroy, etkinliğinizi RAM'de tutmak için BroadcastReceiver'ınızı kullanmadığınız sürece iyidir. Örneğiniz, bir iç sınıfın dış sınıfını sızdırmasıyla kötü bir uygulama gösterir, BroadcastReceiver'a özgü değildir ve programcıların her zaman karşı koymak zorunda olduğu bir şeydir. GUI'yi değiştirmeye gelince, etkinliğin yeniden başlatıldığı zaman için bir durum saklayabilirsiniz, GUI'yi değiştirmeniz gerekmez.
JohanShogun

133

Kapsamlı cevap vermek istiyorum.

  1. LocalbroadcastManager android 3.0 ve üzeri sürümlerde yer almaktadır, bu nedenle erken sürümler için destek kütüphanesi v4'ü kullanmanız gerekir. buradaki talimatlara bakın

  2. Yayın alıcısı oluşturma:

    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. Alıcınızı on'a kaydedin:

    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'ta alıcıyı kaydet

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
  5. Artık uygulamaların etkinliğinden veya hizmetinden bir yerel yayın gönderildiğinde, onNotice onReceive çağrılır :).

Düzenleme: Eğitimin tamamını buradan okuyabilirsiniz LocalBroadcastManager: Uygulama içi mesaj iletme


15
+1. Yayın Alıcınız bir LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
parçadaysa

3
LocalBroadcastManager'ın Android 3.0 ve üstü sürümlerde bulunduğundan emin misiniz? Destek lib dışında hiçbir yerde bulunamıyor
mente

5
garip bir şekilde, LBM sadece destek kütüphanesine dahil edilir.
Jeffrey Blattman

1
super.onPause (), onPause yönteminin üzerine yazılırken son ifade olmalıdır. Öngörülemeyen hatalardan kaçınmak için super.onPause öncesi kaydı sil
Thupten

2
onStop"Çoklu Pencere / Bölünmüş Görünüm" (API 26+ affaicr'de varsayılan olarak etkindir) ile Android API 24+ sürümünde, etkileşimde bulunulmayan etkinlik duraklatılmış durumda olduğu için yaşam döngünüzü taşımak isteyebileceğinize inanıyorum . Kaynak: developer.android.com/guide/topics/ui/…
Martin Marconcini

45

Alım sonunda:

  • İlk kayıt LocalBroadcast Receiver
  • Sonra onReceive'da gelen niyet verilerini işleyin.

      @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 
              }
          }
      };

Gönderme Sonunda:

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

   LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Benim durumumda sadece yayın gönderirken kasıtlı hareket ettiğimde aksi halde asla çalışır.Receive () yöntemi asla çağrılmaz ...
Akash Bisariya

27

Eclipse'de, sonunda projeme sağ tıklayıp şunu seçerek Uyumluluk / Destek Kütüphanesi eklemek zorunda kaldım :

Android Tools -> Add Support Library

Eklendikten sonra kodumda LocalBroadcastManagersınıf kullanabildim .


Android Uyumluluk Kütüphanesi


13

localbroadcastmanager kullanımdan kaldırıldı, bunun yerine gözlemlenebilir modelin uygulamalarını kullanın.

androidx.localbroadcastmanager 1.1.0 sürümünde kullanımdan kaldırılıyor

neden

LocalBroadcastManageruygulama çapında bir olay veriyoludur ve uygulamanızdaki katman ihlallerini kucaklar; herhangi bir bileşen diğer herhangi bir bileşenden olayları dinleyebilir. BroadcastManager sisteminin gereksiz kullanım senaryo sınırlamalarını devralır; geliştiriciler Nesneleri yalnızca tek bir işlemde yaşasalar ve hiçbir zaman bırakmasalar bile Niyeti kullanmak zorundadırlar. Aynı nedenden ötürü, özellik bakımından BroadcastManager'ı takip etmez.

Bunlar kafa karıştırıcı bir geliştirici deneyimine katkıda bulunur.

Değiştirme

Kullanımını LocalBroadcastManagergözlemlenebilir modelin diğer uygulamalarıyla değiştirebilirsiniz . Kullanım durumunuza bağlı olarak, uygun seçenekler LiveDataveya reaktif akışlar olabilir.

LiveData'nın avantajı

LiveDataSistem hizmetlerini uygulamanızda paylaşılabilmeleri için sarmak üzere tek nesneyi kullanarak bir nesneyi genişletebilirsiniz . LiveDataSadece izleyebilirsiniz kaynak ihtiyacı bir kez sistem hizmeti ve ardından herhangi bir gözlemci nesne bağlandığı LiveDatanesne.

 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()Yöntem bir örneği olan bir fragmanını geçen LifecycleOwnerilk bağımsız değişken olarak,. Bu, bu gözlemcinin Lifecyclesahibiyle ilişkili nesneye bağlı olduğunu gösterir , yani:

  • Yaşam Döngüsü nesnesi etkin durumda değilse, değer değişse bile gözlemci çağrılmaz.

  • Yaşam Döngüsü nesnesi yok edildikten sonra, gözlemci otomatik olarak kaldırılır

Aslında LiveDatanesneleri Birden faaliyetleri, parçaları ve hizmetler arasında paylaşabilirsiniz yaşam döngüsü farkında araçlardır.


1
tüm dünyaya bağlam kaçağı konusunda haklısınız, ancak aktivite olmadan çalışan bir ön plan hizmetinden iletişim kurmak istediğimde uygun bir yedekin ne olacağını bilmek istiyorum, ancak aktivite geldiğinde iletişim kurmaları gerekiyor mu?
ateebahmed

2
LiveData nesnesiyle tek bir sınıf oluşturun ve verilerinizi hizmetten gönderin. Etkinlik başlatıldığında, etkinlik LiveData'yı herhangi bir zarar vermeden kolayca gözlemleyebilir. örneğin: MyServiceData.getInstance (). getMyData (). gözlemleyin ...
Darish

3
LocalBroadcastManager'ı özleyeceğim. Google'daki geliştiriciler için kafa karıştırıcı olsaydı, belki de aşırı mühendislik şeylerini durdurmaları gerekir?
AFD

@Darish Bu singleton sınıfı, onu Application nesnesinde saklamakla eşdeğer midir? Bu tür küresel devletler neden bu tür kötü uygulamalar olarak görülmüyor?
xuiqzy

12

Global yayınınızı LocalBroadcast olarak değiştirme

1) Örnek Oluştur

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2) BroadcastReceiver'ı kaydetmek için

değiştirmek

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

İle

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

3) Yayın mesajı göndermek için

değiştirmek

sendBroadcast(intent);

İle

localBroadcastManager.sendBroadcast(intent);

4) Yayın mesajının kaydını silmek için

değiştirmek

unregisterReceiver(mybroadcast);

İle

localBroadcastManager.unregisterReceiver(mybroadcast);

Birden fazla IntentFilter'ı nasıl kaydedebilirim?
Parikshit Chalke

@ParikshitChalke: bağlantı
XMAN

6

LocalBroadcastReceiver ile yeterince oynayacağınız zaman, Green Robot'un EventBus'unu denemenizi öneririm - LBR'ye kıyasla bunun farkını ve kullanışlılığını kesinlikle fark edeceksiniz. Daha az kod, alıcının iş parçacığı (UI / Bg) hakkında özelleştirilebilir, alıcıların kullanılabilirliğini, yapışkan olayları, olayları veri dağıtımı vb.



0
enter code here if (createSuccses){
                        val userDataChange=Intent(BRODCAST_USER_DATA_CHANGE)
                        LocalBroadcastManager.getInstance(this).sendBroadcast(
                            userDataChange
                        )
                        enableSpinner(false)
                        finish()

0

AndroidManifest.xml dosyanızda etiketiyle (statik olarak da adlandırılır) birini bildirerek

<receiver android:name=".YourBrodcastReceiverClass"  android:exported="true">
<intent-filter>
    <!-- The actions you wish to listen to, below is an example -->
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>

Yukarıda beyan edilen yayın alıcısının exported = ”true” özelliğine sahip olduğunu göreceksiniz. Bu öznitelik alıcıya uygulamanın kapsamı dışında yayın alabileceğini bildirir.
2. Veya bir örneği registerReceiver'a kaydederek (bağlam kayıtlı olarak bilinir)

public abstract Intent registerReceiver (BroadcastReceiver receiver, 
            IntentFilter filter);

public void onReceive(Context context, Intent intent) {
//Implement your logic here
}

Yayın göndermenin üç yolu vardır:
sendOrderedBroadcast yöntemi, yayınları aynı anda yalnızca bir alıcıya göndermenizi sağlar. Her yayın sırayla, verileri takip edene aktarabilir veya yayının takip eden alıcılara yayılmasını durdurabilir.
SendBroadcast, yukarıda belirtilen yönteme benzerdir ve bir fark vardır. Tüm yayın alıcıları mesajı alır ve birbirine bağlı değildir.
LocalBroadcastManager.sendBroadcast yöntemi yalnızca uygulamanızın içinde tanımlanan alıcılara yayın gönderir ve uygulamanızın kapsamını aşmaz.


-4

Ayrıca broadcastManger ile aynı arayüzü kullanabilirim Burada broadcastManager için testd kodunu paylaşıyorum ama arayüzle.

önce aşağıdaki gibi bir arayüz yapın:

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

2-Bu, uygulamaya ihtiyaç duyan birinci sınıftır

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-burada metodu otomatik olarak çağıran aynı arayüzü uygulayan ikinci sınıf

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

bu nedenle bu yaklaşımla broadcastManager ile aynı işlevi gören arayüzü kullanabiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.