코드네임 :

📱 모바일프로그래밍 - 브로드캐스트 리시버 📱 본문

👾Android/Android_JAVA

📱 모바일프로그래밍 - 브로드캐스트 리시버 📱

비엔 Vien 2024. 12. 7. 10:32

[ 브로드캐스트 리시버 ]

: 문자메시지 도착, 배터리 방전, SD카드 탈부착, 네트워크 환경 변화 등이 발생했을때 방송(브로드캐스트) 신호 보냄

: 이러한 신호를 받아서 처리하는게 브로드캐스트 리시버

(예를 들어 배터리가 20%일때 아이폰에서 Low Battery라고 알림 뜨잖어)

 

 

 

배터리 상태 체크 앱

Project10_2

 

MainActivity.java

oncreate 함수 바깥

 // 액티비티가 일시 중지되었을 때(onPause),
    // 브로드캐스트 리시버를 등록 해제하여 더 이상 배터리 상태 변경 이벤트를 수신하지 않도록 합니다.
    @Override
    protected void onPause() {

        // super : 자식 클래스에서 부모 클래스의 메서드나 생성자를 명시적으로 호출할 때 사용
        // 즉, super.onPause();는 부모 클래스의 기본 동작을 수행 (액티비티가 일시중지 상태로 전환될때 호출됨)
        super.onPause();

        //리시버(br)를 등록 해제하여 리소스 누수를 방지
        unregisterReceiver(br);
    }


    // 액티비티가 다시 활성화되었을 때(onResume),
    // 배터리 상태 변경 브로드캐스트를 수신하도록 리시버를 등록합니다.
    @Override
    protected void onResume() {
        super.onResume();

        //Intent.ACTION_BATTERY_CHANGED 액션을 filter에 추가하여 배터리 상태 변경 이벤트만 수신
        IntentFilter filter  = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);

        // 정의된 리시버(br)를 등록하여 브로드캐스트를 감지
        registerReceiver(br,filter);
    }


    // 브로드캐스트리시버 객체 br 정의
    BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        // onReceive() : Intent 객체에 담긴 정보를 바탕으로 배터리 상태를 파악하고 UI를 업뎃
        public void onReceive(Context context, Intent intent) {

            // intent.getAction(): 현재 수신한 브로드캐스트의 액션(이벤트 종류)을 action 변수에 가져옴
            String action = intent.getAction();

            // 이벤트 종류가 Intent.ACTION_BATTERY_CHANGED 라면
            if (action.equals(Intent.ACTION_BATTERY_CHANGED)){
                //배터리 잔량(0~100)을 가져와 remain에 저장
                int remain = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);

                // binding.edtBattery.setText를 사용해 화면에 잔량을 표시
                binding.edtBattery.setText("현재 충전량 : " + remain + "/n");


                // 배터리 상태에 따른 이미지 업데이트
                if(remain >= 90)
                    binding.ivBattery.setImageResource(R.drawable.battery_100);
                if(remain >= 70)
                    binding.ivBattery.setImageResource(R.drawable.battery_80);
                if(remain >= 50)
                    binding.ivBattery.setImageResource(R.drawable.battery_60);
                if(remain >= 10)
                    binding.ivBattery.setImageResource(R.drawable.battery_20);
                else
                    binding.ivBattery.setImageResource(R.drawable.battery_0);

                // 현재 충전 상태 plug에 가져오기
                int plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);

                // switch문으로 충전 상태를 확인하고, 텍스트뷰에 결과를 추가
                // (0이라면 충전중이지 않은 상태/BatteryManager.BATTERY_PLUGGED_AC: 충전 중)
                switch (plug){
                    case 0:
                        binding.edtBattery.append("전원 연결 : 안됨 " + "\n");
                        break;
                    case BatteryManager.BATTERY_PLUGGED_AC:
                        binding.edtBattery.append("전원 연결 : 어댑터 연결 " + "\n");
                        break;
                }
            }

        }
    };