안드로이드 스튜디오에서 빈 프로젝트를 하나 만들어보면 MainActivity가 자동으로 추가되어 있다.

안드로이드 앱은 반드시 하나 이상의 액티비티를 가지고 있어야 한다.
액티비티와 같이 안드로이드 앱을 구성하는 4가지 구성 요소는 아래와 같다.

  • Activity (액티비티)
  • Service (서비스)
  • Broadcast Receiver (브로드캐스트 수신자)
  • Content Provider (콘텐츠 제공자)

 

안드로이드 앱이 설치될 때, 안드로이드 시스템은 이 각각의 구성요소에 대한 정보를 요구한다.
이 구성요소들에 대한 정보를 모아놓는 파일이 바로 AndroidManifest.xml이다.

안드로이드의 구성 요소 네가지는 새로 만들 때 반드시 그에 대한 정보를 manifest에 추가해야 한다.
예를들어, 새로운 액티비티를 추가하면 <activity> 태그를 추가해야한다. 태그 안에서는 name, label 등 액티비티의 속성을 정의할 수 있다.

 

Activity (액티비티)

액티비티는 사용자가 어떤 활동을 할 때 실행되는 애플리케이션의 컴포넌트를 의미한다.
기본적으로 하나의 액티비티가 하나의 화면을 표시한다.

액티비티를 만들려면 액티비티를 상속한 클래스를 만들어야 한다. 일반적으로 Activity 클래스를 상속받는 AppCompatActivity를 상속받는다. 액티비티를 상속받음으로써 안드로이드 머티리얼 디자인에 따른 AppCompat 라이브러리를 활용할 수 있다.

 

액티비티의 수명주기 (Lifecycle)

액티비티에는 여러가지 상태가 존재한다. 상태가 변경될 때마다 정해진 콜백 메서드가 호출된다. 하나의 액티비티가 생성(onCreate)되고 소멸(onDestroy)되기 까지의 흐름을 수명주기라고 한다.

안드로이드의 수명주기 (출처 : 안드로이드 공식 문서)

액티비티의 백스택(BackStack)

하나의 액티비티로만 구성된 앱은 드물다. 앱을 사용되며 중첩되는 액티비티들은 스택(Stack) 자료구조로 관리된다.
액티비티를 차곡차곡 쌓다가 가장 상위에 있는 액티비티가 없어지면 위에서부터 차례대로 꺼내 이전의 액티비티를 다시 보여준다.

 

Service (서비스)

서비스는 백그라운드에서 실행되는 프로세스를 의미한다. 화면을 띄우지 않고 필요한 기능을 수행해야할 때 사용한다.
manifest에 등록할 때는 <service> 태그를 사용한다.
서비스는 Service 클래스를 상속받아 만들 수 있으며 startService() 메서드를 호출하면 시작된다.
서비스도 액티비티처럼 수명주기가 있어서 상태에 따라 자동으로 정해진 콜백이 호출된다.

 

Broadcast Receiver (브로드캐스트 수신자)

여러 객체에게 메세지를 전달하고 싶을 때 브로드캐스팅을 사용한다.
예를들어, 단말에서 발생한 SMS 수신 이벤트를 다른 앱에서 사용해야하는 경우가 있을 것이다.
이렇게 발생한 브로드캐스팅 메세지는 BroadcastReceiver를 이용해 받을 수 있다.
받고 싶은 메세지의 종류를 manifest에 등록하면 그 메세지가 해당 애플리케이션에 전달되는 방식이다. 메세지는 Intent 객체로 만들어져 전달된다.

 

아래는 SMS 수신 이벤트를 정의하는 간단한 예시이다.

  1. BroadcastReceiver를 상속받는 클래스를 만들어 onReceive() 메서드를 재정의한다. 지정된 메세지가 수신되면 이 메서드가 자동으로 호출된다.

    public class SMSReceiver extends BroadcastReceiver {
    
     @Override
     public void onReceive(Context context, Intent intent) {
         System.out.println("SMS 수신 이벤트 발생");
     }
    }
  2. AndroidManifest.xml에 <receive> 태그를 이용해 새로운 BroadcastReceiver를 추가한다. 태그는 <application> 태그 내부에 삽입한다. (SMS 읽기 권한을 받으려면 <uses-permission android:name="android.permission.RECEIVE_SMS" /> 로 사용자 권한 허락을 받는 코드도 포함되어 있어야 한다)

    <receiver android:name=".SMSReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

Content Provider (콘텐츠 제공자)

콘텐트 제공자는 앱 사이에서 각종 데이터를 공유할 수 있게 해주는 컴포넌트로, 중앙 저장소에서 외부 프로세스에 데이터를 제공하는 표준 인터페이스의 역할을 한다.

주로 사용되는 것으로는 개인 연락처인 Contacts나 이미지, 동영상 등의 데이터를 보관하는 MediaStore, 내부DB가 필요할 때 쓰는 SQLite 등이 있다.
ContentResolver를 상속받은 객체로 콘텐츠 제공자의 데이터에 액세스할 수 있다.