본문 바로가기

안드로이드

안드로이드_브로드캐스트 리시버

브로드캐스트 리시버(Broadcast Receiver)

- 특징

  • 안드로이드에서 발생하는 많은 이벤트를 감지하여 해당 상황에서 메세지를 받을 수 있음
  • 배터리 부족이나 문자 메세지와 같은 이벤트에 대한 방송 신호(Broadcast)를 받아서 처리하는 방식으로 동작
  • Intent에 메세지를 담아 전달하는 방식 사용

- 구현

  • 정적 구현

    * 문자 메세지를 받았을 때, 송신자의 번호와 문자 내용을 화면에 출력하는 프로그램 구현

    1. app/java에 BroadcastReceiver 클래스를 상속받는 SmsReceiver.java 생성 후 onReceive() 오버라이딩

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) { ... }
}

         2. app/manifests/AndroidManifest.xml의 <application> 태그 안에 receiver 추가

<!-- SMS 수신하기 위한 권한(RECEIVE_SMS) 추가 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application ...>
    ...
    <receiver
         android:name=".SmsReceiver"
         android:enabled="true"
         android:exported="true">
        <!-- intent-filter 안에 수신하고자 하는 메세지 유형을 action으로 정의-->
         <intent-filter>
             <action android:name="android.provider.Telephony.SMS_RECEIVED" />
         </intent-filter>
    </receiver>
    ...
</application>

 

 

  • 동적 구현

     * 버튼 클릭 시 Toast 메세지로 수신한 메세지 출력하는 프로그램 구현

      app/java/MainActivity.java에 다음과 같이 코드 작성

package ...
import  ...

public class MainActivity extends AppCompatActivity {
    int number = 0; // 전송한 메세지 수

    // 리시버 생성 및 수신 시 동작 설정
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int receivedData = intent.getIntExtra("msg", 0);
            Toast.makeText(context, "Data: "+receivedData, Toast.LENGTH_LONG).show();

            if(intent.getAction().equals("BroadcastReceive")) {
                Toast.makeText(context, "Data: "+receivedData, Toast.LENGTH_LONG).show();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // IntentFilter 설정
        IntentFilter filter = new IntentFilter();
        filter.addAction("BroadcastReceive");
        registerReceiver(broadcastReceiver, filter); // 리시버 연결

        // 버튼 클릭 시 메세지 전달
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("BroadcastReceive");
                intent.putExtra("msg", number);
                sendBroadcast(intent);
                number++;
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadcastReceiver); // 리시버 연결 해제
    }
}

- 정적 리시버 vs 동적 리시버

정적 리시버 동적 리시버
- 한 번 등록하면 해체하기 어려움
=> 계속 유지
- 사용하고 싶은 특정 컴포넌트의 멤버 변수에 접근 불가
- 등록과 해체가 유연
=> 등록, 해체가 빈번한 경우 유리
- 자신을 등록한 Activity의 생명 주기에 영향 받음
- 컴포넌트 안의 변수와 메소드에 접근 유연

 

- 주의사항

  • 브로드캐스트 리시버는 하나씩 순차적으로 동작하기 때문에 여러 개의 리시버를 등록한 경우에는 마지막에 실행되는 리시버의 작업 지연이 심해질 수 있음
    => 되도록 간단한 작업만 하도록..
  • bindService 허용되지 않음

 

 

'안드로이드' 카테고리의 다른 글

깃허브 [remote reject] 에러 발생 시 해결  (0) 2021.01.13
스플래시(Splash) 화면 만들기  (0) 2021.01.12
자바와 코틀린 -2  (0) 2021.01.08
안드로이드_서비스  (0) 2021.01.07
자바와 코틀린  (0) 2021.01.06