국비교육(22-23)

74일차(5)/Android App(29) : Broadcast Receiver

서리/Seori 2023. 1. 24. 15:57

74일차(5)/Android App(29) : Broadcast Receiver

 

 

새 모듈 생성 - step12broadcastreceiver - Empty Activity 로

 

- Android 4대 컴포넌트 중 Broadcast Receiver 를 사용해볼 예정! (방송 수신자)

- 우리의 앱에서 비행기모드가 켜졌는지 꺼졌는지 들어보려고 한다.

- 폰에서 일어나는 이벤트들을 Broadcast Receiver 를 통해서 들을 수가 있다.

 

- 각각의 앱에서 필요로 하는 이벤트가 다르다.

- 개별 앱이 관심이 있는 이벤트만 소식을 받을 수 있도록 방송 수신자 객체를 만들어 둔다.

 

 

- 그냥 만들어도 되긴 하는데, Broadcast Receiver 는 android manifest 객체에 등록되어야만 쓸 수 있다.

- 위 방식으로 만들면 자동으로 등록되어서 편하다!

 

 

AirModeReceiver

package com.example.step12broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

/*
    [ BroadcastReceiver 를 만드는 방법 ]

    1. BroadcastReceiver 추상 클래스를 상속받아서 만든다.
    2. onReceive() 메소드를 오버라이딩해서 방송 수신이 되었을 때 원하는 작업을 한다.
    3. AndroidManifest.xml 문서에 등록을 해야 동작을 한다.
    4. Activity 혹은 Service에서 방송 수신자 객체를 생성해서 등록하는 코드를 작성한다.
 */
public class AirModeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //메소드의 인자로는 context 객체와 intent 객체가 전달된다.
        //Intent 객체는 이 발송 수신자 객체가 활성화될 때 전달된 intent 객체이다.
        Toast.makeText(context, "방송이 수신되었네?", Toast.LENGTH_SHORT).show();
        Log.e("AirModeReceiver","방송이 수신되었네?");
        //비행기모드가 활성화되었는지 여부
        boolean isActivated=intent.getBooleanExtra("state",false);
        Log.e("AirModeReceiver", "비행기 모드 활성화 여부 : "+isActivated);
    }
}

 

- BroadcastReceiver 추상클래스를 상속받아서 만들었고, onReceive가 오버라이드되어 있다.

 

- Android Manifest를 보면 자동으로 등록되어 있다.

 

[ BroadcastReceiver 를 만드는 방법 ]
1. BroadcastReceiver 추상 클래스를 상속받아서 만든다.
2. onReceive() 메소드를 오버라이딩해서 방송 수신이 되었을 때 원하는 작업을 한다.
3. AndroidManifest.xml 문서에 등록을 해야 동작을 한다.
4. Activity 혹은 Service에서 방송 수신자 객체를 생성해서 등록하는 코드를 작성한다.
   혹은 AndroidManifest.xml 문서에 직접 IntentFilter 설정을 하면 액티비티에서 등록하지 않아도 동작한다.

 

- 메소드에서 토스트 메시지를 띄우고 Log 출력하도록 수정함

 

 

MainActivity

package com.example.step12broadcastreceiver;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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


        AirModeReceiver amr=new AirModeReceiver();
        IntentFilter filter=new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        //발송수신자 객체를 등록하기
        registerReceiver(amr, filter);
    }
}

 

- Intent 객체에 상수로 설정되어 있는 값이 매우 많다!

 

- ACTION_BOOT_COMPLETED : 부팅이 완료되었을때

- ACTION_AIRPLANE_MODE_CHANGED : 비행기 모드가 바뀌었는지 등등..

 

- 발송수신자 객체를 등록하기

 

- 이것만으로 등록된다면 메소드가 자동으로 호출되고, toast 메시지도 나오고, log도 출력할 것이다.

 

- 가상기기에서 비행기모드를 껐다 켰다 할때마다 log가 출력된다.

- 방송이 수신되고 있는 것을 알 수 있다.

 


 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyAndroid">
        <receiver
            android:name=".AirModeReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.AIRPLANE_MODE"/>
            </intent-filter>
        </receiver>

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

<action android:name="">

- manifest 에서 추가적인 속성을 넣어준다.

- 이렇게 넣어주면 저 유형의 intent를 받을 수 있도록 자동으로 등록해준다.

 

- phone 에는 여러가지 intent들이 날아다니고 있다.

- 그 intent에 귀를 기울이고 있다가 전달해준다고 생각하면 된다.

 

 

- intent 3 이 airplane 모드와 관련된 intent 객체라고 하면,

  intent-filter가 귀를 기울이고 있다가 이 AirMode Receiver가 활성화된다.

- onReceive 메소드가 실행되고, 안에 있는 코드가 수행된다.

 

- 사실 activity도 intent가 있기 때문에 실행되는 것이다.

 android.intent.action.MAIN 에서 사용자의 행동에 귀를 기울여서 앱을 실행시키고 화면을 보여주는 것이다.

 

- AirMode Receiver 가 있어서 저 정보의 수신이 가능한 것!

 


 

- 비행기 모드를 켰는지 껐는지 알아내기 위해 수정!

 

 

- initent에 정보가 담겨있다.

- "state"라는 키값으로 담긴 것이 있는지 없는지 읽어오기

 

- false는 디폴트 값이다.

- 이걸 읽어오려고 했을 때 state로 저장된 값이 없을 수도 있으므로... 기본값을 저장해주는 것\

 

- 이렇게 켜졌는지 꺼졌는지 여부가 응답된다.