방송 수신기를 프로그래밍 방식으로 등록


149

방송 수신기를 프로그래밍 방식으로 등록하는 가장 좋은 방법 / 방법이 무엇인지 알고 싶습니다. 사용자 선택에 따라 특정 수신기를 등록하고 싶습니다.

등록은 매니페스트 파일을 통해 수행되므로 코드에서이를 달성하는 적절한 방법이 있는지 궁금합니다.



이 링크를 참조하십시오. stackoverflow.com/questions/15698790/…

답변:


64

매니페스트에 게시 된 구성 요소가 활성 상태인지 여부를 제어하려는 것 같습니다 (실행 중 Context.registerReceiver ()를 통해) 수신기를 동적으로 등록하지 마십시오.

그렇다면 PackageManager.setComponentEnabledSetting ()을 사용하여 이러한 구성 요소의 활성화 여부를 제어 할 수 있습니다.

http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)

실행 중 브로드 캐스트 수신에만 관심이있는 경우 registerReceiver ()를 사용하는 것이 좋습니다. 수신기 구성 요소는 주로 브로드 캐스트가 전송 될 때마다 앱을 시작해야하는 경우에 유용합니다.


1
영리한! 당신은 날 똑바로 얻었다. 대단히 감사합니다
CoolStraw

좋은 것-당신이 이것을 할 수있을 줄 몰랐습니다 :)
Chris Noldus


1
@hackbod 어떻게 커스텀 리시버에 메타 데이터 태그를 추가 할 수 있습니까? 당신은 어떤 아이디어를 가지고있다! androidmanifest.xml에서 사용하는 메타 데이터 태그를 추가해야합니다.
Zala Janaksinh

1
날짜까지 최고의 튜토리얼 coderzpassion.com/implement-broadcastreceiver-android 및 간단한 언어
Jagjit Singh

269

당신에 onCreate방법이 같은 수신기를 등록 할 수 있습니다 :

private BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState){

  // your oncreate code should be

  IntentFilter filter = new IntentFilter();
  filter.addAction("SOME_ACTION");
  filter.addAction("SOME_OTHER_ACTION");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something based on the intent's action
    }
  };
     registerReceiver(receiver, filter);
}

onDestroy메소드 에서 이것을 실행해야합니다 .

 @Override
 protected void onDestroy() {
  if (receiver != null) {
   unregisterReceiver(receiver);
   receiver = null;
  }
  super.onDestroy();
 }

19
고마워, 이것은 잘 작동했습니다. 브로드 캐스트를 보내려면 코드 Intent i = new Intent ( "SOME_ACTION"); sendBroadcast (i);
벤 클레이튼

7
왜 이력서와 시작하지 않습니까?
Syed Raza Mehdi

브로드 캐스트 수신기를 등록 취소하지 않으면 어떻게됩니까? 재부팅 후에도 브로드 캐스트 수신기가 등록 된 상태로 유지됩니까?
Jaydev

5
onDestroy()호출이 보장되지 않아 잠재적 인 메모리 누수가 발생할 수 있습니다. 그것은 / 등록 취소에 등록하는 것이 좋습니다 onStart()/ onStop().
Neria Nachum

브로드 캐스트 수신기 클래스를 만들 필요가 없다는 의미입니까? 모든 onReceive () 코드를 여기에 넣을 수 있으며 작동합니까?
Taslim Oseni

70

사람들이 언급하는 것을 잊어 버린 한 가지 중요한 점은의 수명입니다 Broadcast Receiver. 프로그래밍 방식으로 AndroidManifest.xml에 등록하는 것과 차이점 이 있습니다. 매니페스트 파일에서는 응용 프로그램 수명에 의존하지 않습니다. 프로그래밍 방식으로 등록 할 때는 응용 프로그램 수명에 따라 다릅니다. 이는 AndroidManifest.xml에 등록 하면 애플리케이션이 실행 중이 아닌 경우에도 브로드 캐스트 된 의도를 포착 할 수 있음을 의미합니다 .

편집 : 언급 한 메모는 Android 3.1부터 더 이상 사실이 아니며, Android 시스템은 사용자가 해당 응용 프로그램을 시작한 적이 없거나 사용자가 Android 메뉴를 통해 응용 프로그램을 명시 적으로 중지 한 경우 기본적으로 모든 수신자가 의도를 수신하지 못하도록합니다 관리 → 응용 프로그램). https://developer.android.com/about/versions/android-3.1.html

이것은 사용자가 시작한 응용 프로그램 만 브로드 캐스트 인 텐트를받을 수 있다는 것을 확신 할 수있는 추가 보안 기능입니다.

따라서 응용 프로그램에 프로그래밍 방식으로 등록 된 수신기 onCreate()는 위의 Android 3.1 에서 AndroidManifest.xml에 선언 된 수신기 와 동일한 효과를 갖습니다 .


1
이것은 좋은 메모입니다. 나는 실제로 안드로이드에 대해 읽고있는 책을보고 있는데 왜 방송을 구현하는 두 가지 방법이 모두 수행되었는지 궁금합니다. 그것은 이전 버전과의 호환성을위한 것 같습니다. 그러나 나는 확실하지 않다.
Neon Warge

글쎄, 당신은 정말로 편집 내용이 사실입니까? 마지막 문장을 의미합니다. Android는 언제든지 응용 프로그램을 종료시킬 수 있으므로 프로그래밍 방식으로 등록 된 수신기가 더 이상 작동하지 않지만 등록 된 매니페스트는 계속 작동합니다.
JacksOnF15

40

다음과 같이 Activity / Fragment의 어느 곳에 나 브로드 캐스트 리시버를 정의하십시오.

mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.d(TAG," onRecieve"); //do something with intent
   }
 };

에 IntentFilter 정의 onCreate()

mIntentFilter=new IntentFilter("action_name");

이제 브로드 캐스트 onResume()리시버를 등록하고 onPause()[활동이 일시 중지 된 경우 브로드 캐스트를 사용하지 않기 때문에] 에서 등록을 취소하십시오 .

@Override
protected void onResume() {
     super.onResume();
     registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onPause() {
    if(mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
    }
    super.onPause();
}

자세한 자습서를 보려면 브로드 캐스트 리시버 두 가지 구현 방법을 살펴보십시오 .


내가 찾은 최고의 예! 감사!
Ayush Goyal

1
@SohailAziz이 링크는 좋은 답변을 제공합니다. 링크의 컨텍스트를 응답에 넣을 수 있습니까? 링크가 다운 되더라도 응답이 계속 관련이 있습니까?
iRuth

내 개인적인 관점에서 방송은 제안한대로 onResume 및 onPause에 등록해야하지만 일부 사람들은 onCreate 및 onDestroy에 있어야한다고 말하고 두 가지의 장단점을 설명 할 수 있습니까?
Syed Raza Mehdi

2
브로드 캐스트를 사용하여 UI (대부분의 경우)를 업데이트하는 데 사용되는 경우 @SyedRazaMehdi 브로드 캐스트는 쓸모가 없기 때문에 onResume에 등록하고 onPause에서 등록을 취소해야합니다.
SohailAziz

감사합니다. 이것이 가장 좋은 대답입니다.
Saeid Z

4
package com.example.broadcastreceiver;


import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

   UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver();

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   /**
    * This method enables the Broadcast receiver for
    * "android.intent.action.TIME_TICK" intent. This intent get
    * broadcasted every minute.
    *
    * @param view
    */
   public void registerBroadcastReceiver(View view) {

      this.registerReceiver(broadCastReceiver, new IntentFilter(
            "android.intent.action.TIME_TICK"));
      Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT)
            .show();
   }

   /**
    * This method disables the Broadcast receiver
    *
    * @param view
    */
   public void unregisterBroadcastReceiver(View view) {

      this.unregisterReceiver(broadCastReceiver);

      Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT)
            .show();
   }
}

1
이것이 왜 모범 사례인지 OP에 설명해 주시겠습니까?
Martin Prikryl 2016 년

1
"그들"은 항상 코드를 게시한다고 설명하지 않습니다. -sarcasm
Neon Warge

2

글로벌 메시지 수신 및 브로드 캐스트 및 일반적인 작업 에서 알람 설정 및 Android에서 알람을 수행 하는 방법에 따르면 :

수신 클래스가 매니페스트에서 사용하여 등록되지 않은 경우 Context.registerReceiver () 를 호출하여 수신자를 동적으로 인스턴스화하고 등록 할 수 있습니다. .

자세한 내용 은 registerReceiver (BroadcastReceiver 수신기, IntentFilter 필터) 를 참조하십시오.


1
전화를 시도했지만 전화가 context.registerReceiver걸리지 않을 수 있습니다.이 질문을보십시오. stackoverflow.com/questions/13238600/…
Hunt

2

수신자를 등록 할 때 항상 권한을 제공하는 것이 가장 좋습니다. 그렇지 않으면 일치하는 의도를 보내는 모든 애플리케이션에 대해 수신하게됩니다. 이를 통해 악의적 인 앱이 수신자에게 브로드 캐스트 될 수 있습니다.


1

대한 LocalBroadcastManager

   Intent intent = new Intent("any.action.string");
   LocalBroadcastManager.getInstance(context).
                                sendBroadcast(intent);

등록 onResume

LocalBroadcastManager.getInstance(
                    ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter);

등록을 취소하십시오 onStop

LocalBroadcastManager.getInstance(
                ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver);

그리고 그것을받을 ..

mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("mBroadcastReceiver", "onReceive");
        }
    };

IntentFilter는

 new IntentFilter("any.action.string")

1

두 가지 선택

1) 활동이 표시 될 때만 브로드 캐스트를 읽으려면

registerReceiver(...)에서 onStart()unregisterReceiver(...)에서onStop()

2) 활동이 백그라운드에 있어도 브로드 캐스트를 읽으려면

registerReceiver(...)안으로 onCreate(...)그리고 unregisterReceiver(...)안으로onDestroy()

보너스:

당신이 게으른 경우

각 활동에서 BroadcastReceiver를 반복적으로 등록 및 등록 취소하기위한 상용구 코드를 작성하지 않으려면,

  1. 추상 활동 만들기
  2. 활동에 상용구 코드 작성
  3. 구현을 추상 메소드로 남겨 두십시오.

다음은 코드 스 니펫입니다.

추상 활동

public abstract class BasicActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;
    private IntentFilter filter;
    private static final String TAG = "BasicActivity";

    /**********************************************************************
    *                   Boilerplate code
    **********************************************************************/

    @Override
    public void onCreate(Bundle sis){
        super.onCreate(sis);
        broadcastReceiver = getBroadcastReceiver();
        filter = getFilter();
    }

    @Override
    public void onStart(){
        super.onStart();
        register();
    }

    @Override
    public void onStop(){
        super.onStop();
        unregister();
    }

    private void register(){
        registerReceiver(broadcastReceiver,filter);
    }

    private void unregister(){
        unregisterReceiver(broadcastReceiver);
    }

    /**********************************************************************
    *                   Abstract methods
    **********************************************************************/

    public abstract BroadcastReceiver getBroadcastReceiver();

    public abstract IntentFilter getFilter();

}

이 방법을 사용하면 일반적인 애니메이션 작성, 서비스 바인딩 등과 같은 더 많은 상용구 코드를 작성할 수 있습니다.

전체 코드보기 :

여기


0

방송 수신기 만들기

[BroadcastReceiver (활성화 = true, 내보내기 = false)]

public class BCReceiver : BroadcastReceiver
{

    BCReceiver receiver;

    public override void OnReceive(Context context, Intent intent)
    {
        //Do something here
    }
}

활동에서 다음 코드를 추가하십시오.

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