Android
BroadcastReceiver
수색…
소개
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 는 응용 프로그램 프로세스 내에서 브로드 캐스트를 보내거나받는 방법입니다. 이 메커니즘에는 많은 장점이 있습니다.
- 데이터가 애플리케이션 프로세스 내부에 남아 있기 때문에 데이터가 유출 될 수 없습니다.
- LocalBroadcast는 정상적인 방송의 해상도가 OS 전체의 런타임에서 발생하기 때문에 더 빨리 해결됩니다.
LocalBroastManager의 간단한 예는 다음과 같습니다.
SenderActivity
Intent intent = new Intent("anEvent");
intent.putExtra("key", "This is an event");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
ReceiverActivity
- 수신자 등록
LocalBroadcastManager.getInstance(this).registerReceiver(aLBReceiver, new IntentFilter("anEvent"));
- 수신기가 호출 될 때 동작을 수행하기위한 구체적인 객체
private BroadcastReceiver aLBReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // perform action here. } };
- 뷰가 더 이상 표시되지 않으면 등록을 취소합니다.
@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);