LocalBroadcastManager를 사용하는 방법?


452

Google 문서 및 서비스 방송 문서에LocalBroadcastManager 설명 된대로 사용 / 찾기 방법은 무엇입니까?

나는 그것을 시도했지만 시작할 수있는 코드가 없습니까?

문서에 따르면 앱 프로세스에서 내부적으로 브로드 캐스트하고 싶지만 어디서 찾아야할지 모르겠습니다.

도움 / 의견이 있습니까?

업데이트 : 방송 사용 방법을 알고 있지만 LocalBroadcastManager프로젝트에서 사용 가능한 방법을 모르겠습니다 .


Waqas, 수신자를 매니페스트에 등록했습니다. 그렇다면 어떻게 알려주십시오.
— Mudassir

2
그런 브로드 캐스트에 수신기를 등록해야한다고 생각하지 않습니다. 그렇게하면 해당 수신기가 글로벌 브로드 캐스트를 수신하기 때문입니다.
— waqaslam

2
진실. 그런 다음 아래 답변에서 주어진 코드로 수행해야합니다. LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
— Mudassir

2
LocalBroadcastManager더 이상 사용되지 않습니다. 나는 훨씬 더 좋은 EventBus 라이브러리로 내 것을 대체했습니다.
— 크리스 B

답변:


861

어쨌든 대답하겠습니다. 누군가가 필요로하는 경우를 대비하여.

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! 

7
감사. 이미 작동하고 있습니다. 그러나 내가 직면 한 문제는 LocalBroadcastManager 클래스를 유지하는 것이 었습니다. 지원 패키지 클래스이기 때문에 Android 도구에서 호환성 라이브러리를 추가 할 때까지 일반 패키지에서 사용할 수 없었습니다. 일단 추가되면 모든 것이 잘되었습니다. 어쨌든, 답변 주셔서 감사합니다
— waqaslam

195
참고 onDestroy()보장되지 않으므로 호출 할 수 있습니다! 당신은 onPause()(만 onPause()보장 되기 때문에)를 사용해야합니다 ( 와 onResume()일치하기 때문에 onPause())
— 18446744073709551615

5
여러분, 이제 Google 문서에서 onPause () 이후의 활동에 대해 다음과 같이 설명합니다. Killable = Pre-HONEYCOMB Honeycomb 부터 응용 프로그램은 onStop ()이 반환 될 때까지 killable 상태가 아닙니다.
— 18446744073709551615

59
onDestroy()문제 없습니다. 호출되지 않은 경우는 앱이 종료 된 경우이며 등록 된 수신자 목록조차도 생존하지 않기 때문에이 경우 등록을 취소하지 않아도 중요하지 않습니다.
— zapl

4
@Selvin BroadcastReciever가 수신 활동을 약하게 참조하고 분리 된 경우 자체 등록을 해제 할 수 있음을 알고 싶습니다. onPause에서 등록을 해제 할 필요가 없습니다. 활동을 RAM으로 유지하기 위해 BroadcastReceiver를 사용하지 않는 한 onDestroy가 좋습니다. 귀하의 예제는 내부 클래스가 외부 클래스를 유출하는 나쁜 습관을 보여줍니다. BroadcastReceiver에는 고유하지 않으며 프로그래머가 항상 경계 해야하는 것입니다. GUI 수정과 관련하여 활동이 재개 될 때의 상태를 저장할 수 있으며 GUI를 수정할 필요가 없습니다.
— JohanShogun

133

나는 종합적으로 대답하고 싶습니다.

  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. 이제 응용 프로그램의 활동이나 서비스에서 로컬 브로드 캐스트가 전송 될 때마다 onNotice의 onReceive가 호출됩니다. :)

편집 : 당신은 전체 자습서를 읽을 수 있습니다 LocalBroadcastManager : 응용 프로그램 내부 메시지 전달


15
+1. 방송 수신기가 프래그먼트에있는 경우이를 사용 LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);하여 등록 및 등록 해제LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
— PeteH

3
LocalBroadcastManager가 Android 3.0 이상에 포함되어 있습니까? support lib
— mente

5
이상하게도 LBM은 지원 라이브러리에만 포함됩니다.
— Jeffrey Blattman

1
onPause 메소드를 겹쳐 쓸 때 super.onPause ()는 마지막 명령문이어야합니다. super.onPause 전에 등록 취소는 예측할 수없는 버그를 피하기 위해
— Thupten

2
onStop“Multi-Window / Split-View”가있는 Android API 24+ (API 26+ affaicr에서 기본적으로 활성화 됨)에서 상호 작용하지 않는 활동이 일시 중지 된 상태이기 때문에 수명주기를 이동하고 싶을 것 입니다. 출처 : developer.android.com/guide/topics/ui/…
— Martin Marconcini 2011

45

수신 종료시 :

  • 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);

방송을 전송하는 ... 방법은 호출되지 않습니다 () 그렇지 않으면 onReceive 작동 할 때 내 경우에는 단지 내가 의도에서 작업을 설정하는 경우
— 아카 쉬 Bisariya을

27

Eclipse에서 결국 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 다음을 선택하여 호환성 / 지원 라이브러리 를 추가해야 했습니다.

Android Tools -> Add Support Library

그것이 추가되면 LocalBroadcastManager코드에서 클래스 를 사용할 수있었습니다 .


안드로이드 호환성 라이브러리


12

글로벌 브로드 캐스트를 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);

여러 개의 IntentFilter를 어떻게 등록 할 수 있습니까?
— Parikshit Chalke

@ParikshitChalke : link
— XMAN

12

localbroadcastmanager는 더 이상 사용되지 않으며 대신 관찰 가능한 패턴의 구현을 사용하십시오.

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소유자와 연관된 객체에 바인딩되어 있음을 나타냅니다 .

  • Lifecycle 객체가 활성 상태가 아닌 경우 값이 변경 되더라도 옵저버가 호출되지 않습니다.

  • 수명주기 객체가 파괴되면 관찰자가 자동으로 제거됩니다.

사실 LiveData객체가 여러 활동, 조각, 서비스 사이에 공유 할 수 있습니다 라이프 사이클 인식 수단이다.


1
전 세계에 컨텍스트를 유출하는 것에 대해서는 맞습니다.하지만 활동이 없어도 실행되는 포 그라운드 서비스와 통신하고 싶을 때 활동이 대체 될 수있는 것이 무엇인지 알고 싶습니다.
— ateebahmed

1
LiveData 객체로 싱글 톤 클래스를 만들고 서비스에서 데이터를 게시하십시오. 활동이 시작되면 활동은 아무런 피해없이 LiveData를 쉽게 관찰 할 수 있습니다. 예 : MyServiceData.getInstance (). getMyData (). observe ...
— Darish

3
LocalBroadcastManager를 그리워합니다. 구글 개발자에게 혼란 스러웠다면 아마도 과도한 엔지니어링을 중단해야 할까?
— AFD

@Darish이 싱글 톤 클래스가 Application 객체에 저장하는 것과 동등합니까? 이런 경우에 이런 종류의 세계 상태는 왜 나쁜 습관으로 간주되지 않습니까?
— xuiqzy

6

LocalBroadcastReceiver로 충분히 플레이 할 때 Green Robot의 EventBus 를 사용해 볼 것을 제안합니다 .LBR 과 비교하여 차이점과 유용성을 분명히 깨달을 것입니다. 더 적은 코드, 수신자 스레드 (UI / Bg)에 대해 사용자 정의 가능, 수신자 가용성 확인, 스티키 이벤트, 이벤트는 데이터 전달 등으로 사용될 수 있습니다.



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

0

태그가있는 AndroidManifest.xml 파일에서 태그를 선언하여 (정적이라고도 함)

<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>

위에서 선언 한 브로드 캐스트 리시버의 속성은 export =”true”입니다. 이 속성은 수신자에게 애플리케이션 범위 외부에서 브로드 캐스트를 수신 할 수 있음을 알려줍니다.
2. 또는 registerReceiver에 인스턴스를 등록하여 동적으로 등록 (컨텍스트가 등록됨)

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

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

브로드 캐스트를 보내는 방법에는 세 가지가 있습니다
. sendOrderedBroadcast 메소드는 한 번에 하나의 수신자에게만 브로드 캐스트를 보내도록합니다. 각 브로드 캐스트는 차례로 데이터를 따라 다음 브로드 캐스트로 전달하거나 후속 수신기로 브로드 캐스트 전파를 중지 할 수 있습니다.
sendBroadcast는 위에서 언급 한 방법과 비슷하지만 한 가지 차이점이 있습니다. 모든 브로드 캐스트 리시버는 메시지를 수신하며 서로 의존하지 않습니다.
LocalBroadcastManager.sendBroadcast 메서드는 응용 프로그램 내에 정의 된 수신기에만 브로드 캐스트를 전송하며 응용 프로그램의 범위를 초과하지 않습니다.


-4

우리는 또한 broadcastManger와 동일한 인터페이스를 사용할 수 있습니다. 여기서 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와 동일한 기능을하는 인터페이스를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.