수색…


소개

BroadcastReceiver (수신기)는 시스템 또는 응용 프로그램 이벤트에 등록 할 수있는 Android 구성 요소입니다. 이 이벤트가 발생하면 Android 런타임은 등록 된 모든 이벤트 수신자에게 알림을 보냅니다.

예를 들어, 화면이 꺼 졌거나, 배터리가 부족하거나, 사진이 캡처되었음을 알리는 방송입니다.

또한 응용 프로그램은 브로드 캐스트를 시작할 수 있습니다. 예를 들어 다른 응용 프로그램에서 일부 데이터가 장치에 다운로드되어 사용할 수 있음을 알리는 등의 작업을 수행 할 수 있습니다.

방송 수신기 소개

브로드 캐스트 수신기는 시스템 또는 응용 프로그램 이벤트에 등록 할 수있는 Android 구성 요소입니다.

리시버는 AndroidManifest.xml 파일을 통해 등록하거나 Context.registerReceiver() 메소드를 통해 동적으로 등록 할 수 있습니다.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}

여기서는 ACTION_BOOT_COMPLETED 의 예를 ACTION_BOOT_COMPLETED , Android가 부팅 프로세스를 완료하면 시스템에서 해고되었습니다.

다음과 같이 매니페스트 파일에 수신자를 등록 할 수 있습니다.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   </receiver>
</application>

이제 장치가 부팅되고 onReceive() 메서드가 호출 된 다음 작업을 수행 할 수 있습니다 (예 : 서비스 시작, 경보 시작).

BroadcastReceiver 기본 사항

BroadcastReceivers는 Android OS, 다른 앱 또는 동일한 앱에서 전송 된 브로드 캐스트 인 텐트 를 수신하는 데 사용됩니다.

각 인 텐트는 인 텐트 필터 (Intent Filter )로 만들어지며, 인 텐트 필터 ( String Action) 가 필요합니다. 인 텐트에서 추가 정보를 구성 할 수 있습니다.

마찬가지로, BroadcastReceivers는 특정 인 텐트 필터로 인 텐트를 수신하도록 등록합니다. 프로그래밍 방식으로 등록 할 수 있습니다.

mContext.registerReceiver(new BroadcastReceiver() {
    @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}, new IntentFilter("Some Action"));

또는 AndroidManifest.xml 파일에서

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="Some Action"/>
    </intent-filter>
</receiver>

인 텐트를 수신하려면 Android OS에서, 다른 앱이나 API로, 또는 자신의 응용 프로그램에서 sendBroadcast 사용하여 문서화 된 것으로 조치를 설정하십시오.

mContext.sendBroadcast(new Intent("Some Action"));

또한 의도에는 onReceive 에서 볼 수있는 문자열, 프리미티브 및 Parcelables 와 같은 정보가 포함될 수 있습니다.

LocalBroadcastManager 사용

LocalBroadcastManager 는 원하지 않는 리스너에 노출시키지 않고 응용 프로그램 내에서 브로드 캐스트 인 텐트 를 보내는 데 사용됩니다.

LocalBroadcastManager를 사용하면 context.sendBroadcast() 직접 사용하는 것보다 효율적이고 안전합니다. 다른 응용 프로그램에서 위장한 브로드 캐스트를 걱정할 필요가 없으므로 보안 상 위험 할 수 있습니다.

다음은 로컬 브로드 캐스트를 보내고받는 간단한 예제입니다.

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("Some Action")) {
            //Do something
        }
    }
});

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(mContext);
manager.registerReceiver(receiver, new IntentFilter("Some Action"));

// onReceive() will be called as a result of this call:
manager.sendBroadcast(new Intent("Some Action"));//See also sendBroadcastSync

//Remember to unregister the receiver when you are done with it:
manager.unregisterReceiver(receiver);

블루투스 브로드 캐스트 수신기

매니페스트 파일에 권한 추가

<uses-permission android:name="android.permission.BLUETOOTH" />

귀하의 단편 (또는 활동)

  • 리시버 메소드 추가
private BroadcastReceiver mBluetoothStatusChangedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle extras = intent.getExtras();
        final int bluetoothState = extras.getInt(Constants.BUNDLE_BLUETOOTH_STATE);
        switch(bluetoothState) {
            case BluetoothAdapter.STATE_OFF:
                // Bluetooth OFF
                break;
            case BluetoothAdapter.STATE_TURNING_OFF:
                // Turning OFF
                break;
            case BluetoothAdapter.STATE_ON:
                // Bluetooth ON
                break;
            case BluetoothAdapter.STATE_TURNING_ON:
                // Turning ON
                break;
    }
};

방송 등록

  • onResume ()에서이 메서드를 호출하십시오.
private void registerBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.registerReceiver(mBluetoothStatusChangedReceiver, new IntentFilter(Constants.BROADCAST_BLUETOOTH_STATE));
}

브로드 캐스트 등록 취소

  • onPause ()에서이 메서드를 호출하십시오.
private void unregisterBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    // Beacon機能用
    manager.unregisterReceiver(mBluetoothStatusChangedReceiver);
}

브로드 캐스트 수신기를 프로그래밍 방식으로 사용하거나 사용하지 않도록 설정

BroadcastReceiver 를 활성화 또는 비활성화하려면 PackageManager 대한 참조를 PackageManager 하며 활성화 / 비활성화 할 수신기 클래스가 포함 된 ComponentName 객체가 필요합니다.

ComponentName componentName = new ComponentName(context, MyBroadcastReceiver.class);
PackageManager packageManager = context.getPackageManager();

이제 다음 메소드를 호출하여 BroadcastReceiver 를 활성화 할 수 있습니다.

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP);

또는 COMPONENT_ENABLED_STATE_DISABLED 를 사용하여 수신기를 사용 중지 할 수 있습니다.

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
    PackageManager.DONT_KILL_APP);

BroadcastReceiver가 BOOT_COMPLETED 이벤트를 처리합니다.

아래 예제는 BOOT_COMPLETED 이벤트를 수신 할 수있는 BroadcastReceiver 를 작성하는 방법을 보여줍니다. 이렇게하면 곧 장치를 켤 때 Service 시작하거나 Activity 을 시작할 수 있습니다.

또한 BOOT_COMPLETED 이벤트를 사용하여 장치의 전원이 꺼져있을 때 장치가 파괴되므로 경보를 복원 할 수 있습니다.

참고 : 사용자는 BOOT_COMPLETED 작업을 받기 전에 응용 프로그램을 한 번 이상 시작해야합니다.

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.example" >
    ...
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    ...

    <application>
        ...

        <receiver android:name="com.test.example.MyCustomBroadcastReceiver">
        <intent-filter>
                <!-- REGISTER TO RECEIVE BOOT_COMPLETED EVENTS -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action != null) {
            if (action.equals(Intent.ACTION_BOOT_COMPLETED) ) {
                // TO-DO: Code to handle BOOT COMPLETED EVENT
                // TO-DO: I can start an service.. display a notification... start an activity
            } 
        }
    }
}

LocalBroadcastManager의 예제

BroadcastReceiver는 기본적으로 특정 동작을 수행하기 위해 OS를 통해 인 텐트를 릴레이하는 메커니즘입니다. 고전적인 정의

"브로드 캐스트 수신기는 시스템 또는 응용 프로그램 이벤트에 등록 할 수있는 Android 구성 요소입니다."

LocalBroadcastManager 는 응용 프로그램 프로세스 내에서 브로드 캐스트를 보내거나받는 방법입니다. 이 메커니즘에는 많은 장점이 있습니다.

  1. 데이터가 애플리케이션 프로세스 내부에 남아 있기 때문에 데이터가 유출 될 수 없습니다.
  2. LocalBroadcast는 정상적인 방송의 해상도가 OS 전체의 런타임에서 발생하기 때문에 더 빨리 해결됩니다.

LocalBroastManager의 간단한 예는 다음과 같습니다.

SenderActivity

  Intent intent = new Intent("anEvent");
  intent.putExtra("key", "This is an event");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

ReceiverActivity

  1. 수신자 등록
LocalBroadcastManager.getInstance(this).registerReceiver(aLBReceiver,
              new IntentFilter("anEvent"));
  1. 수신기가 호출 될 때 동작을 수행하기위한 구체적인 객체
private BroadcastReceiver aLBReceiver = new BroadcastReceiver() {
    @Override 
    public void onReceive(Context context, Intent intent) {
        // perform action here.
    } 
};
  1. 뷰가 더 이상 표시되지 않으면 등록을 취소합니다.
@Override 
protected void onPause() { 
    // Unregister since the activity is about to be closed. 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(aLBReceiver);
    super.onDestroy(); 
}

사용자 정의 브로드 캐스트 수신기를 통해 두 가지 활동을 전달합니다.

활동 B에서 발생하는 이벤트를 활동 A가 알 수 있도록 두 가지 활동을 알릴 수 있습니다.

활동 A

final String eventName = "your.package.goes.here.EVENT";

@Override
protected void onCreate(Bundle savedInstanceState) {
    registerEventReceiver();
    super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
    unregisterEventReceiver(eventReceiver);
    super.onDestroy();
}

private void registerEventReceiver() {
    IntentFilter eventFilter = new IntentFilter();
    eventFilter.addAction(eventName);
    registerReceiver(eventReceiver, eventFilter);
}

private BroadcastReceiver eventReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
         //This code will be executed when the broadcast in activity B is launched
    }
};

활동 B

final String eventName = "your.package.goes.here.EVENT";

private void launchEvent() {
    Intent eventIntent = new Intent(eventName);
    this.sendBroadcast(eventIntent);
}

물론 방송에 추가 정보를 추가하여 활동간에 전달되는 인 텐트에 추가 정보를 추가 할 수 있습니다. 예제를 가능한 한 간단하게 유지하기 위해 추가되지 않았습니다.

끈끈한 방송

sendStickyBroadcast (intent) 메쏘드를 사용한다면, 해당 인 텐트는 끈기가 있습니다. 즉, 브로드 캐스트가 끝난 후에 보내려는 인 텐트는 계속 남아 있습니다. 이름에서 알 수 있듯이 StickyBroadcast는 브로드 캐스트가 완료된 후 브로드 캐스트에서 데이터를 읽는 메커니즘입니다. 이것은 Activity's onCreate() 에서 액티비티가 시작되기 전에 인 텐트에있는 키의 값을 말하고 싶을 수있는 시나리오에서 사용될 수 있습니다.

Intent intent = new Intent("com.org.action");
intent.putExtra("anIntegerKey", 0);
sendStickyBroadcast(intent);

순서가 지정된 브로드 캐스트 사용

순서가 지정된 브로드 캐스트는 브로드 캐스트 수신기의 우선 순위를 지정해야하는 경우에 사용됩니다.

이 예에서 firstReceiver 는 항상 secondReceiver 보다 먼저 브로드 캐스트를 수신합니다.

final int highPriority = 2;
final int lowPriority = 1;
final String action = "action";

// intent filter for first receiver with high priority
final IntentFilter firstFilter = new IntentFilter(action);
first Filter.setPriority(highPriority);
final BroadcastReceiver firstReceiver = new MyReceiver();

// intent filter for second receiver with low priority
final IntentFilter secondFilter = new IntentFilter(action);
secondFilter.setPriority(lowPriority);
final BroadcastReceiver secondReceiver = new MyReceiver();

// register our receivers
context.registerReceiver(firstReceiver, firstFilter);
context.registerReceiver(secondReceiver, secondFilter);

// send ordered broadcast
context.sendOrderedBroadcast(new Intent(action), null);

또한 브로드 캐스트 리시버는 순서가 지정된 브로드 캐스트를 중단 할 수 있습니다.

@Override
public void onReceive(final Context context, final Intent intent) {
    abortBroadcast();
}

이 경우 우선 순위가 낮은 모든 수신자는 브로드 캐스트 메시지를 수신하지 않습니다.

Android 정지 상태

Android 3.1부터는 모든 응용 프로그램이 설치시 중지 상태가됩니다. 중지 된 상태에서 응용 프로그램은 어떤 이유로 든 실행되지 않습니다. 단, 수동으로 활동을 시작하거나 활동, 서비스 또는 브로드 캐스트를 처리하는 명시적인 의도가 있어야합니다.

APK를 직접 설치하는 시스템 앱을 작성하는 경우 새로 설치 한 APP는 중단되지 않은 상태로 전환 될 때까지 브로드 캐스트를 수신하지 않습니다.

앱을 활성화하는 쉬운 방법은이 앱에 명시적인 브로드 캐스트를 보내는 것입니다. 대부분의 앱은 INSTALL_REFERRER 구현하므로 후킹 포인트로 사용할 수 있습니다.

설치된 앱의 매니페스트를 스캔하고 명시적인 브로드 캐스트를 각 수신자에게 보냅니다.

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setComponent(new ComponentName(packageName, fullClassName));
sendBroadcast(intent);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow