본문 바로가기

모바일/안드로이드

[Android] BroadcastReceiver

Broadcast

시스템이나 다른 앱이 발생시키는 Broadcast를 구독하거나 내 앱이 게시 가능

ex) 폰 부팅, 충전 시작, 블루투스 기능 상태 변화

 

구독하는법

1. AndroidManifest.xml에 선언하기

   1) 앱이 실행중이 아니면 앱을 실행

   2) Android 8.0 Oreo API 26부터는 일부 Broadcast를 제외하고는 사용 불가

   3) https://developer.android.com/guide/components/broadcast-exceptions?hl=ko 

 

암시적 브로드캐스트 예외  |  Android 개발자  |  Android Developers

백그라운드 제한에서 제외되는 암시적 브로드캐스트입니다.

developer.android.com

 

2. Context에 등록하기

   1) 앱 실행 중에 등록하는 것

   2) Broadcast Receiver와 Intent Filter를 사용

 

 

Bluetooth switch

사용자가 bluetooth 기능을 켜거나 끌 수있는 Switch를 화면에 추가

 

1. Permission 앱의 activity_mail.xml에 Switch

<Switch
   android:id="@+id/switchBluetooth"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="16dp"
   android:switchPadding="8dp"
   android:text="Bluetooth"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toBottomOf="@+id/buttonSend" />

 

 

2. 필요한 Permission 추가

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

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

 

 

3. 앱이 실행될 때 현재 Bluetooth기능의 상태를 확인해 Switch 업데이트

4. Switch를 켜고 끄는데 맞춰 기능을 켜고 끈다

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if(adapter!=null)
   binding.switchBluetooth.setChecked(adapter.isEnabled());
   
binding.switchBluetooth.setOnCheckedChangeListener((v, b)->{
   if(adapter!=null){
     if(b) adapter.enable();
     else adapter.disable();
   }
});

 

 

5. BroadcastReceiver 클래스 생성

독립된 클래스로 만들 경우 GUI 갱신이 어려움

내부 클래스로 만들 경우 코드 복잡도가 올라감

-> Switch 상태만 바꾸면 되는 간단한 기능이므로 내부 클래스로 작성

class BTReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent) {
    String action=intent.getAction();
    if(action!=null && action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)){
      int state=intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
      switch(state){
        case BluetoothAdapter.STATE_TURNING_ON:
        case BluetoothAdapter.STATE_ON:
            binding.switchBluetooth.setChecked(true);
            break;
        case BluetoothAdapter.STATE_TURNING_OFF:
        	binding.switchBluetooth.setChecked(false);
        case BluetoothAdapter.STATE_OFF: break;
      }
    }
  }
}

 

 

클래스 변수 추가

public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;
    private final int REQ_SMS=10;
    private BTReceiver btReceiver;

 

 

onCreate 함수 마지막 수정 및 onDestroy Override

btReceiver = new BTReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(btReceiver, filter);
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(btReceiver);
}

 

'모바일 > 안드로이드' 카테고리의 다른 글

[Android] Step2 - 활동(Activity)  (0) 2021.06.22
[Android] Step1 - 안드로이드 소개  (0) 2021.06.22
[Android] Permission  (0) 2021.06.18
[Android Studio] RecyclerView  (0) 2021.04.04
[Android Studio] SharedPreference  (0) 2021.04.04