Android Programming

[Mobile Programming] 방송 수신자

gangintheremark 2021. 12. 4. 01:05
728x90

방송 수신자

  • 애플리케이션에 필요한 이벤트를 필터링하는 컴포넌트
  • 원하는 방송이 나왔을 경우에 그 정보를 가져와 처리하는 작업
public class MyBroadcastReceiver extends BroadcastReceiver { // 방송 수신자 기능을 제공하는 부모 클래스
        public void onReceive(Contextcontext, Intentintent) {
            ... // 방송이 수신되면 이 메소드 호출 → 필요한 코드를 넣음
        }
    }

방송 수신자 등록 방법

  • 매니페스트 파일에서 선언 : 8.0이상 버전 동작 안함
  • 자바 코드에서 동적 등록 : 8.0 이상 버전에서 '방송 수신자' 등록 요구
  • 암시적 방송 수신자의 경우 매니페스트 파일 선언 시 동작 안함
    →registerReceiver 메서드 사용해 java 코드에서 등록
 // 방송 수신자의 인텐트 필터 
      <receiver android:name="MyBroadcastReceiver"> 
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED">
                </action>
            </intent-filter>
        </receiver>

실습

  • 방송 수신자 클래스 정의
  • onReceive 메소드를 재정의, 필요한 방송 정보 선택
  • 자바 프로그램에서 방송 수신자 등록
  • 인텐트 필터에 필터링 할 액션 지정 → registerReceiver 메소드 호출
public class MainActivity extends AppCompatActivity {
    TextView myText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myText = (TextView) findViewById(R.id.textView);

    }
    public void onResume() {
        super.onResume();

        IntentFilter filter = new IntentFilter();

        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(receiver, filter);
    }
    @Override
    public void onPause() {
        // onPause 경우 현재 방송 수신을 unregisterReceiver를 사용해 해제
        super.onPause();
        unregisterReceiver(receiver);
    }
    BroadcastReceiver receiver = new BroadcastReceiver() {

        // onReceive는 방송이 수신되었을 때 어떻게 행동할 것인가를 정의하는 부분
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Toast.makeText(context, action, Toast.LENGTH_LONG).show();

            myText.setText(action);

            // 두 가지 Action을 비교하여 같을 때 처리하는 작업 진행
            if(action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                int maxvalue = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0);
                int value = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                int level = value * 100 / maxvalue;

                // level은 'max value'가 최대로 충전된 양이고, 'value'는 현재의 양임임

               myText.setText(action + "\n 현재 배터리 레벨 : " + level);
            }
            else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
                // 배터리 부족 메시지 띄움
                myText.setText(action +  "\n 배터리가 부족한 상황입니다.");
            }
        }
    };
}

728x90