활동 소개

Activity 클래스는 Android 앱에서 중요한 구성요소이며 활동이 시작되어 조합되는 방식은 플랫폼 애플리케이션 모델의 기본적인 부분입니다. 앱이 main() 메서드로 실행되는 프로그래밍 패러다임과 달리 Android 시스템은 수명 주기의 특정 단계에 상응하는 특정 콜백 메서드를 호출하여 Activity 인스턴스의 코드를 시작합니다.

이 문서에서는 활동의 개념을 소개한 다음 활동을 사용하는 방법을 가볍게 안내합니다. 앱 아키텍처 권장사항에 관한 자세한 내용은 앱 아키텍처 가이드를 참고하세요.

활동의 개념

모바일 앱 환경은 사용자와 앱의 상호작용이 항상 동일한 위치에서 시작되는 것은 아니라는 점에서 데스크톱 앱 환경과 다릅니다. 대신 사용자 여정은 흔히 비결정론적으로 시작됩니다. 예를 들어 홈 화면에서 이메일 앱을 열면 이메일 목록이 표시될 수 있습니다. 반면에 이메일 앱을 실행하는 소셜 미디어 앱을 사용하고 있다면 이메일 앱 화면으로 바로 이동하여 이메일을 작성할 수도 있습니다.

Activity 클래스는 이 패러다임을 촉진하도록 설계되었습니다. 한 앱이 다른 앱을 호출하는 경우 호출 앱은 하나의 전체 활동이 아니라 다른 앱의 활동을 호출합니다. 이러한 방식으로 활동은 앱과 사용자의 상호작용의 진입점 역할을 합니다. 활동은 Activity 클래스의 서브클래스로 구현됩니다.

활동은 앱이 UI를 그리는 창을 제공합니다. 이 창은 일반적으로 화면을 채우지만 화면보다 작고 다른 창 위에 떠 있을 수 있습니다. 일반적으로 한 활동은 앱에서 하나의 화면을 구현합니다. 예를 들어 앱의 활동 중 하나는 환경설정 화면을 구현하고 다른 활동은 사진 선택 화면을 구현할 수 있습니다.

대부분의 앱에는 여러 화면이 포함되어 있습니다. 즉, 앱은 여러 활동으로 구성됩니다. 일반적으로 앱의 한 활동은 사용자가 앱을 실행할 때 표시되는 첫 번째 화면인 기본 활동으로 지정됩니다. 그러면 각 활동은 다양한 작업을 실행하기 위해 다른 활동을 시작할 수 있습니다. 예를 들어 간단한 이메일 앱의 기본 활동은 이메일 받은편지함을 표시하는 화면을 제공할 수 있습니다. 여기서 기본 활동은 이메일 작성 및 개별 이메일 열기와 같은 작업을 위한 화면을 제공하는 다른 활동을 실행할 수 있습니다.

활동이 함께 작동하여 앱에서 일관된 사용자 환경을 형성하지만 각 활동은 다른 활동에 느슨하게 바인딩됩니다. 일반적으로 한 앱의 활동 간에는 최소한의 종속 항목이 있습니다. 실제로 활동은 종종 다른 앱에 속한 활동을 시작합니다. 예를 들어 브라우저 앱이 소셜 미디어 앱의 공유 활동을 실행할 수 있습니다.

앱에서 활동을 사용하려면 앱의 매니페스트에 활동에 관한 정보를 등록하고 활동 수명 주기를 적절하게 관리해야 합니다. 이 문서의 나머지 부분에서는 이러한 주제를 소개합니다.

manifest 구성

앱에서 활동을 사용할 수 있으려면 매니페스트에서 활동과 활동의 특정 속성을 선언해야 합니다.

활동 선언

활동을 선언하려면 매니페스트 파일을 열고 <activity> 요소를 <application> 요소의 하위 요소로 추가합니다. 예:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

이 요소의 유일한 필수 속성은 활동의 클래스 이름을 지정하는 android:name입니다. 또한 라벨, 아이콘 또는 UI 테마와 같은 활동 특성을 정의하는 속성을 추가할 수도 있습니다. 이러한 속성과 기타 속성에 관한 자세한 내용은 <activity> 요소 참조 문서를 확인하세요.

참고: 앱을 게시한 후에는 활동 이름을 변경하면 안 됩니다. 활동 이름을 변경하면 앱 바로가기와 같은 일부 기능이 작동하지 않을 수 있습니다. 게시 후 피해야 할 변경사항에 관한 자세한 내용은 변경할 수 없는 사항을 참고하세요.

인텐트 필터 선언

인텐트 필터는 Android 플랫폼의 매우 강력한 기능입니다. 또한 명시적 요청뿐만 아니라 암시적 요청을 기반으로도 활동을 시작할 수 있는 기능을 제공합니다. 예를 들어 명시적인 요청은 시스템에 'Gmail 앱에서 이메일 보내기 활동을 시작'하도록 지시할 수 있습니다. 반면, 암시적 요청은 '작업을 할 수 있는 활동에서 이메일 보내기 화면을 시작'하라고 시스템에 알립니다. 시스템 UI에서 사용자에게 작업 실행에 사용할 앱을 묻는 메시지가 표시되면 인텐트 필터가 작동 중입니다.

<activity> 요소에서 <intent-filter> 속성을 선언하여 이 기능을 활용할 수 있습니다. 이 요소의 정의에는 <action> 요소와 선택적으로 <category> 요소 및 <data> 요소가 포함됩니다. 이러한 요소가 결합되어 활동이 응답할 수 있는 인텐트 유형을 지정합니다. 예를 들어, 다음 코드 스니펫은 텍스트 데이터를 전송하고 다른 활동에서 요청을 수신하는 활동을 구성하는 방법을 보여줍니다.

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

이 예에서 <action> 요소는 이 활동이 데이터를 전송하도록 지정합니다. <category> 요소를 DEFAULT로 선언하면 활동이 실행 요청을 수신할 수 있습니다. <data> 요소는 이 활동이 전송할 수 있는 데이터 유형을 지정합니다. 다음 코드 스니펫은 위에서 설명한 활동을 호출하는 방법을 보여줍니다.

Kotlin

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Java

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
앱이 독립적이면서 다른 앱이 앱의 활동을 활성화하지 못하게 하려면 다른 인텐트 필터가 필요하지 않습니다. 다른 애플리케이션에서 사용할 수 없도록 하려는 활동에는 인텐트 필터가 없어야 하며 명시적 인텐트를 사용하여 활동을 직접 시작할 수 있습니다. 활동이 인텐트에 응답할 수 있는 방법에 관한 자세한 내용은 인텐트 및 인텐트 필터를 참고하세요.

권한 선언

매니페스트의 <activity> 태그를 사용하여 특정 활동을 시작할 수 있는 앱을 제어할 수 있습니다. 상위 활동은 두 활동이 매니페스트에서 동일한 권한을 갖지 않으면 하위 활동을 실행할 수 없습니다. 상위 활동에 <uses-permission> 요소를 선언하면 각 하위 활동에 일치하는 <uses-permission> 요소가 있어야 합니다.

예를 들어 앱에서 SocialApp이라는 가상의 앱을 사용하여 소셜 미디어의 게시물을 공유하려면 SocialApp 자체에서 앱을 호출하는 앱이 보유해야 하는 권한을 정의해야 합니다.

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

그런 다음 앱이 SocialApp의 매니페스트에 설정된 권한과 일치해야 SocialApp을 호출할 수 있습니다.

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

권한과 보안에 관한 일반적인 자세한 내용은 보안 및 권한을 참조하세요.

활동 수명 주기 관리

활동은 수명 주기 전체 기간에 걸쳐 여러 상태를 거칩니다. 상태 간 전환을 처리하는 데 일련의 콜백을 사용할 수 있습니다. 다음 섹션에서는 이러한 콜백을 소개합니다.

onCreate()

이 콜백을 구현해야 합니다. 이 콜백은 시스템에서 활동을 생성할 때 실행됩니다. 구현 시 활동의 필수 구성요소를 초기화해야 합니다. 예를 들어 앱에서 뷰를 만들고 데이터를 목록에 결합해야 합니다. 무엇보다도 setContentView()를 호출하여 활동의 사용자 인터페이스 레이아웃을 정의해야 합니다.

onCreate()가 완료되면 다음 콜백은 항상 onStart()입니다.

onStart()

onCreate()가 종료되면 활동이 시작됨 상태로 전환되고 활동이 사용자에게 표시됩니다. 이 콜백에는 활동이 포그라운드로 이동하여 상호작용이 되기 위한 최종 준비에 해당하는 작업이 포함됩니다.

onResume()

시스템은 활동이 사용자와 상호작용을 시작하기 직전에 이 콜백을 호출합니다. 이 시점에서 활동은 활동 스택의 맨 위에 있으며 모든 사용자 입력을 캡처합니다. 앱의 핵심 기능은 대부분 onResume() 메서드에서 구현됩니다.

onPause() 콜백은 항상 onResume()를 따릅니다.

onPause()

활동은 활동이 포커스를 잃고 일시중지됨 상태로 전환될 때 onPause()를 호출합니다. 예를 들어 이 상태는 사용자가 뒤로 또는 최근 버튼을 탭할 때 발생합니다. 시스템에서 활동에 관해 onPause()를 호출하면 엄밀히 말하면 활동이 여전히 부분적으로 표시되지만 사용자가 활동을 떠나고 활동이 곧 중지됨 또는 재개됨 상태로 전환됨을 나타내는 경우가 많습니다.

사용자가 UI가 업데이트될 것으로 예상하면 일시중지됨 상태의 활동은 UI를 계속 업데이트할 수 있습니다. 이러한 활동의 예로는 내비게이션 지도 화면이나 재생 중인 미디어 플레이어를 표시하는 활동이 있습니다. 이러한 활동이 포커스를 잃더라도 사용자는 UI가 계속 업데이트될 것으로 예상합니다.

애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크를 호출하거나, 데이터베이스 트랜잭션을 실행하는 데 onPause()를 사용해서는 안 됩니다. 데이터 저장에 관한 자세한 내용은 활동 상태 저장 및 복원을 참고하세요.

onPause() 실행이 완료되면 다음 콜백은 활동이 일시중지됨 상태로 전환된 후 발생하는 상황에 따라 onStop() 또는 onResume()입니다.

onStop()

활동이 사용자에게 더 이상 표시되지 않으면 시스템은 onStop()를 호출합니다. 이는 활동이 소멸되거나 새 활동이 시작되거나 기존 활동이 '재개됨' 상태로 전환되어 중지된 활동을 포함하기 때문에 발생할 수 있습니다. 이 모든 경우 중지된 활동은 더 이상 표시되지 않습니다.

시스템이 호출하는 다음 콜백은 onRestart()(활동이 사용자와 상호작용하기 위해 다시 돌아오는 경우) 또는 onDestroy()(이 활동이 완전히 종료되는 경우)입니다.

onRestart()

시스템은 중지됨 상태의 활동이 다시 시작하려고 할 때 이 콜백을 호출합니다. onRestart()는 활동이 중지된 시간부터 활동 상태를 복원합니다.

이 콜백 뒤에는 항상 onStart()가 옵니다.

onDestroy()

시스템은 활동이 소멸되기 전에 이 콜백을 호출합니다.

이 콜백은 활동이 수신하는 마지막 콜백입니다. onDestroy()는 일반적으로 활동 또는 활동을 포함하는 프로세스가 소멸될 때 활동의 모든 리소스가 해제되도록 구현됩니다.

이 섹션에서는 이 주제에 관한 소개만 제공합니다. 활동 수명 주기 및 그 콜백에 관한 자세한 내용은 활동 수명 주기를 참고하세요.