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.