본문 바로가기
[ Developer ]/Android

[Android] 안드로이드 리시버 Receiver

by 김현섭. 2016. 8. 5.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Android 리시버

브로드캐스트 수신자 (Broadcast Receiver - Receiver)
  • 특정 이벤트가 발생했을 때 다수의 Application 에게 전달하는 서비스.
  • Activity의 인텐트 필터와 유사함.
  • 단, Activity의 인텐트 필터는 사용자에게 선택을 유도하지만 브로드캐스트 수신자는 등록이 되어있다면 모두에게 보낸다.
  • 활용사례
    • 택배 서비스
      • 택배 발송 문자가 오면, 택배 Application의 브로드캐스트 수신자가 문자를 받아 처리한다.
    • WhoWho(후후)
    • 전화가 올 경우 송신 번호를 검색해 스팸 / 광고 전화인지 검색하고, 차단 여부를 결정한다.
  • 브로드캐스트 수신자가 활용하려는 서비스를 미리 권한등록 해두어야 한다.
  • 문자를 받아야 한다면, 문자 퍼미션, 전화를 받아야 한다면 전화 퍼미션 등

실습을 해보기 위해서 My Reciever라는 프로젝트를 생성한다
이제 Manifest에서 권한을 추가해준다




이제 BroadcastReciever를 생성해야 하는데 아래 화면을 보고 java안의 패키지에 생성을 해주면 된다





브로드캐스트 리시버를 생성하면 다음과 같이 BroadcastReceiver를 상속받는 클래스가 생성된다




이제 리시버에 어떤 것을 받겠다는 것이지를 OS에 알려줘야 한다
다시 Manifest로 가서 작성을 해준다
우리가 생성한 Receiver가 생성된 것을 볼 수 있다




리시버에 어떤 역할을 할 것인지 정의를 해주면 된다


* reciever
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        <receiver
            android:name=".MySmsReciever"
            android:enabled="true"
            android:exported="true">
            <!--
                Intent Filter 역할
                 해당 컴포넌트가 동작될 유형을 정의
                 
                 android.intent.action.MAIN : Application에서 가장 먼저 실행 될 Activity 의미
                 android.intent.category.LAUNCHER : Home 화면에 Application을 등록한다는 의미
                 android.provider.Telephony.SMS_RECEIVED : 문자메시지가 올 경우 이벤트를 전달 받는 의미
            -->
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
cs


Receiver가 작동을 하려면 Activity가 한번은 동작을 해야 한다
Toast를 이용해서 테스트를 진행해보자


@ Android Studio에서 문자메시지 보내기

Android Studio에서 에뮬레이터로 전화나 문자를 테스트하기 위해서는 다음의 메뉴로 들어간다



위의 버튼을 누르면 관리하는 창이 뜨게 되는데 Phone 탭에서 문자를 보낼 수 있다




이제 문자를 보기 위해서 onReceive에서 약간의 이미지를 추가해서 테스트 해본다


* onReceive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    /**
     * Android 문자메시지가 도착할 경우 실행
     * @param context
     * @param intent
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onReceive(Context context, Intent intent) {
        LinearLayout ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.HORIZONTAL);
 
        ImageView iv = new ImageView(context);
        Drawable d = context.getDrawable(R.mipmap.ic_launcher);
 
        iv.setImageDrawable(d);
 
        TextView tv = new TextView(context);
        tv.setText("문자 메시지가 도착했습니다");
        tv.setTextColor(Color.BLACK);
 
        ll.addView(iv);
        ll.addView(tv);
        Toast toast = Toast.makeText(context, "문자 도착", Toast.LENGTH_SHORT);
        toast.setView(ll);
        toast.show();
    }
cs


실행 결과는 다음과 같다