Android Studio) 브로드캐스트 리시버(BroadCast Receiver)

chaeyoung·2023년 1월 19일
0

Android Studio

목록 보기
10/13
post-thumbnail

BroadCast(브로드캐스트)

BroadCast Receiver: 이벤트 모델로 수행되는 컴포넌트

  • intent는 실행할 액티비티가 하나일 때만 정상 동장한다. (2개 이상은 하나만 실행, 없을 땐 에러 발생)

  • intent가 발생하여 브로드캐스트 수행시: 없더라도 에러 발생 x, 브로드캐스트 여러개면 모두 실행

    • "없으면 말고 있으면 모두 실행하자"
  • BroadCast Receiver 내부 구현 내용: 업무처리 x, 이벤트모델 컴포넌트가 필요해서 만들어 놓은것

브로드캐스트 리시버 작성 방법

  • BroadCastReceiver을 상속받아 작성하는 클래스 + 내부 onReceive() 함수 정의
    public class MyReceiver extends BroadcastReceiver{
    	  public void onReceive(Context context, Intent intent){
      	  Toast toast = Toast.makeText(context, "I am Broadcast Receiver", Toast.LENGTH_SHORT);
          toast.show();
      }
    }
  • 작성된 브로드캐스트리시버는 안드로이드 컴포넌트 클래스임으로 매니페스트 설정 필요
    		<receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="true"> </receiver>
    • 실행 방법: sendBroadcast()이용, Intent 사용
      Intent intent = new Intent(this, MyReceiver.class)
       sendBroadcast(intent)

시스템 브로드캐스트 인텐트

  • 브로드캐스트 리시버는 앱 내부 + 시스템 상황 감지로도 이용

  • 시스템 브로드캐스트: 많은 브로드캐스트리시버 인텐트 발생시키는데 자주 이용되는 몇가지 설명

    부팅완료

    • 부팅완료 시점에 앱이 동작하여 구동함
      <receiver android:name=".MyReceiver">
      	<intent-filter>
         	<action android:name="android.intent.action.BOOT_COMPLETED"/>
         </intent-filter>
      </receiver>
      • action의 문자열과 같은 문자열로 intent-filter 구성 후 등록
      • 부팅완료 시점에 띄우는 인텐트의 문자열 = action의 name
        • 부팅완료 시점에 브로드캐스트리시버 동작하려면 퍼미션 등록 !!
          <uses-permission android:name="android.permission.RECEIVER_BOOT_COMPLETED"/>

    화면 On / Off

    • 사용자 스마트폰 화면 on/off 사용

    • 시스템에서 브로드캐스트 인텐트 발생시켜 앱에서 브로드캐스트리시버 이용해 상황 감지 가능

    • 매니페스트에 리시버 태그등록하지 않는다(동적 코드 등록 필요)

      // 액티비티 / 서비스 클래스 내부 코드
      BroadcastReceiver brOn = new BroadcastReceiver(){
          public void onReceive(Context context, Intent intent)
              Log.d("kkang","screen on..")
      }
      • 자바 코드에서 브로드캐스트리시버 정의 후 registerReceiver()등록

        registerReceiver(brOn, new IntentFilter(Intent.ACTION_SCREEN_ON);
        
         // 브로드캐스트리시버는 코드에서 동적으로 등록 해제된다.
         unregisterReceiver(btOn)
      • 부팅완료 시점 띄우는 문자열 = "android.intent.action.SCREEN_ON)

    전화 수신 / 발신

    • 전화 수신 발신 상황은 중요한 관점
    • 시스템 발생시키는 인텐트에 반응할 브로드캐스트 리시버 등록으로 감지 가능
      • 전화 감지하려면 퍼미션 선언
        <!-- outgoing: 전화발신 순간, read_phone: 전화수신 순간 -->
         <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
         <uses-permission android:name="android.permission.READ_PHONE_STATE".>
      • 수신, 발신 따라 action 문자열 인텐트 발생이 다르게 설정
        <receiver android:name=".MyReceiver">
        	<intent-filter>
         	    <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
                <action android:name="android.intent.action.PHONE_STATE"/>
          	</intent-filter>
         </receiver>
      • 발신번호: getStringExtra()로 얻음, 수신번호: Bundle 객체 사용
        if(action.equals("android.intent.action.NEW_OUTGOING_CALL")){
        	String phoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
        			// .,,
        } else if(action.equals("android.intent.action.PHONE_STATE")){
        	Bundle bundle = intent.getExtras();
            String state = bundle.getString(TelephonyManager.EXTRA_STATE);
            String phonNum = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
        }

백그라운드 서비스 제한

  • 안드로이드 멀티태스킹제공: 동시에 여러앱 실행 가능, 백그라운드에서도 실핼될 수 있는 구조

  • 백그라운드 실행 제한 두가지

    • 백그라운드 서비스 제한

    • 브로드캐스트 제한

      • 암시적 인턴트에 의한 리비서의 실행 제한

        • BroadcastReceiver를 실행하는 부분만 제한된다.
        • 예시: Manifest.xml에 등록된 리시버를 앱코드에서 인텐트로 실행
              <receiver android:name=".MyReceiver"
                        android:enable="true"
                        android:exported="true">
                  <intent-filter>
                      <action android:name="android.intent.action.MY_RECEIVER"/>
                    </intent-filter>
              </receiver>
           Intent intent = new Intent("com.example.ACTION_MYRECEIVER");
           sendBroadcast(intent);
        • 암시적 방법으로 리시버 실행코드: 로그캣 창에 로그 발생(인텐트 발생 허용x)

0개의 댓글