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

Android/Android · 2020. 6. 16. 21:22
반응형

 

 이번 포스트에선 Broadcast Receiver에 대해 알아보겠습니다. Broadcast는 전화, 혹은 문자 등 어떤 행위가 왔다는 알림을 받고 방송을 해주는 기능입니다. 이 방송은 Intent를 통해 발송하게 되고, 이렇게 발송된 방송은 Broadcast Receiver 객체가 수신을 하게 됩니다.

 

 브로드캐스트는 여러 방송을 발송할 수 있는데, 그중 두 가지 방법을 소개해보도록 하겠습니다.

 

 1. 미리 정의된 방송

 

 안드로이드 기기 내부에서는 각 상황에 따라 미리 정의된 발송을 하며, 해당 방송을 잘 수신하여 적절한 처리를 할 수 있습니다. 다음은 Android Developer 사이트에 나와있는 표준 브로드캐스트 액션이니 한 번 보시면 좋을 것 같습니다. 대충 해석만 해봐도 무슨 소린지 알 수 있습니다.

 

표준 브로드캐스트

 

 이런 표준 브로드캐스트를 Receive하는 것이 글로벌 방송 수신이라고 합니다.

 

 그럼 바로 가기 전에, 여기서 주의하셔야 할 것이 안드로이드 버전이 오레오 이상부터는 앱이 실행 중이 아닐 때는 브로드캐스트 동작을 수행하지 않습니다. 이게 먼 소리냐면, 오레오 이전 버전들은 앱이 꺼져도 정상적으로 브로드캐스트가 수행하였지만, 오레오 이상부터 리소스 소모 등의 이유로 기능이 제한됩니다. 이 점 기억해주시기 바랍니다.

 

 그럼 브로드캐스트 예제를 만들어 보겠습니다. 먼저 브로드캐스트 리시버부터 만들겠습니다.

 

브로드캐스트 리시버

 

 그리고 버튼 하나 추가하겠습니다.

 

 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:onClick="sendMyBroadCast"
        android:text="방송"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

 

 이제 MainActivity.java입니다. 이 클래스는 방송을 하는 발신자 역할을 합니다.

 

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver mReceiveer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mReceiveer = new MyReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_POWER_CONNECTED);
        //로컬로 등록
        filter.addAction(MyReceiver.MyAction);
        registerReceiver(mReceiveer, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiveer);
    }

    public void sendMyBroadCast(View view) {
        //액션을 담아 리시버로 인텐트를 발송
        Intent intent = new Intent(MyReceiver.MyAction);
        sendBroadcast(intent);
    }
}

 

 브로드캐스트는 액티비티 생명주기를 이용합니다. 리시버 등록에 따라 onResume(), onStart(), onPause(), onStop()에 적절히 추가와 삭제를 해주시면 됩니다. 브로드캐스트를 사용하려면 AndroidManifest.xml에 <intent - filter>를 등록해야 합니다. 그러나 암시적 인텐트는 추가를 하지 못해서 IntentFilter객체를 만들어 동적으로 만들어야 합니다. onPause()에선 리시버를 해제합니다. sendBroadcast()는 브로드캐스트 리시버에 액션을 보냅니다.

 

 

 MyReceiver.java

public class MyReceiver extends BroadcastReceiver {

    public final static String MyAction = "hello.world.broadcastreceiverexam.ACTION_MY_BROADCAST";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        //각 방송 정보는 intent로 전달됨
        if (Intent.ACTION_POWER_CONNECTED.equals(intent.getAction())) {
            Toast.makeText(context, "전원 연결", Toast.LENGTH_SHORT).show();
        }
        else if(MyAction.equals(intent.getAction())) {
            Toast.makeText(context, "방송", Toast.LENGTH_SHORT).show();
        }
    }
}

 

 리시버 클래스입니다. 여기서 MyAction은 액션명입니다. '패키지명.action.액션명' 형태로 지정합니다. 여기서 액션명은 자유롭게 지정할 수 있습니다. 이제 intent.getAction()으로 브로드캐스트를 받고, 그 행동이 충전기 연결이 되면 "전원 연결"이 토스트로 뜨게 되고, 버튼을 누르면 "방송"이란 토스트가 화면에 출력됩니다.

 

 다음은 결과입니다.

 

 

 정상적으로 토스트가 출력이 되는 것을 볼 수 있습니다.

 

 

 이번 포스트에선 브로드캐스트에 대해 간략하게 알아봤습니다. 감사합니다.

반응형