Android 기초 02.2: Activity 수명 주기 및 상태

1. 환영합니다

소개

이 실습에서는 활동 수명 주기를 자세히 알아봅니다. 수명 주기는 활동이 생성될 때부터 소멸되고 시스템에서 리소스를 회수할 때까지 전체 기간 동안 활동이 있을 수 있는 일련의 상태입니다. 사용자가 앱에서 활동 간에 그리고 앱 안팎으로 이동함에 따라 활동은 수명 주기의 여러 상태 간에 전환됩니다.

앱 수명 주기 다이어그램

활동 수명 주기의 각 단계에는 상응하는 콜백 메서드(onCreate(), onStart(), onPause() 등)가 있습니다. 활동이 상태를 변경하면 연결된 콜백 메서드가 호출됩니다. 이미 이러한 메서드 중 하나인 onCreate()는 확인했습니다. Activity 클래스에서 수명 주기 콜백 메서드를 재정의하면 사용자 또는 시스템 작업에 응답하여 활동의 기본 동작을 변경할 수 있습니다.

활동 상태도 기기 구성 변경(예: 사용자가 기기를 세로 모드에서 가로 모드로 회전할 때)에 응답하여 변경될 수 있습니다. 이러한 구성 변경이 발생하면 활동이 소멸되고 기본 상태로 재생성되므로 사용자는 활동에 입력한 정보를 잃을 수 있습니다. 사용자에게 혼란을 주지 않기 위해 예기치 않은 데이터 손실을 방지하도록 앱을 개발하는 것이 중요합니다. 이 실습 후반부에서는 구성 변경을 실험하고 기기 구성 변경 및 기타 활동 수명 주기 이벤트에 응답하여 활동 상태를 보존하는 방법을 알아봅니다.

이 실습에서는 TwoActivities 앱에 로깅 문을 추가하고 앱을 사용하면서 활동 수명 주기 변경사항을 살펴봅니다. 그런 다음 이러한 변경사항을 적용하고 이러한 조건에서 사용자 입력을 처리하는 방법을 알아봅니다.

기본 요건

다음을 할 수 있어야 합니다.

  • Android 스튜디오에서 앱 프로젝트를 만들고 실행합니다.
  • 앱에 로그 구문을 추가하고 Logcat 창에서 이러한 로그를 확인합니다.
  • ActivityIntent를 이해하고 이를 활용하며 편안하게 상호작용할 수 있습니다.

학습할 내용

  • Activity 수명 주기 작동 방식
  • Activity가 시작, 일시중지, 중지, 소멸되는 시점
  • Activity 변경사항과 연결된 수명 주기 콜백 메서드에 관한 정보
  • Activity 수명 주기 이벤트를 초래할 수 있는 작업(예: 구성 변경)의 영향
  • 수명 주기 이벤트에서 Activity 상태를 유지하는 방법

실행할 작업

  • 이전 실습의 TwoActivities 앱에 코드를 추가하여, 로깅 문을 포함하도록 다양한 Activity 수명 주기 콜백을 구현합니다.
  • 앱이 실행될 때 그리고 앱의 각 Activity와 상호작용할 때 상태 변경사항을 관찰합니다.
  • 기기에서의 사용자 동작이나 구성 변경에 응답하여 예기치 않게 다시 생성되는 Activity의 인스턴스 상태를 유지하도록 앱을 수정합니다.

2. 앱 개요

이 실습에서는 TwoActivities 앱에 추가합니다. 앱은 지난 Codelab에서와 거의 동일하게 보이고 동작합니다. 두 개의 Activity 구현을 포함하며 사용자에게 둘 사이에 전송할 수 있는 기능을 제공합니다. 이 실습에서 이뤄진 앱 변경사항은 표시되는 사용자 동작에 영향을 미치지 않습니다.

3. 작업 1: TwoActivities에 수명 주기 콜백 추가

이 작업에서는 모든 Activity 수명 주기 콜백 메서드를 구현하여 이러한 메서드가 호출될 때 Logcat에 메시지를 출력합니다. 이러한 로그 메시지를 통해 Activity 수명 주기에서 상태가 변경되는 시점과 이러한 수명 주기 상태 변경이 실행 중인 앱에 미치는 영향을 확인할 수 있습니다.

1.1(선택사항) TwoActivities 프로젝트 복사

이 실습의 작업에서는 지난 실습에서 빌드한 기존 TwoActivities 프로젝트를 수정합니다. 이전 TwoActivities 프로젝트를 그대로 유지하려면 부록: 유틸리티의 단계에 따라 프로젝트를 복사하세요.

1.2 MainActivity에 콜백 구현

  1. Android 스튜디오에서 TwoActivities 프로젝트를 열고 Project > Android 창에서 MainActivity를 엽니다.
  2. onCreate() 메서드에서 다음 로그 구문을 추가합니다.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. 해당 이벤트의 로그에 문과 함께 onStart() 콜백 재정의를 추가합니다.
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

바로가기의 경우 Android 스튜디오에서 Code > Override Methods를 선택합니다. 클래스에서 재정의할 수 있는 모든 메서드가 포함된 대화상자가 표시됩니다. 목록에서 콜백 메서드를 하나 이상 선택하면 슈퍼클래스에 대한 필수 호출을 비롯하여 해당 메서드의 전체 템플릿이 삽입됩니다.

  1. onStart() 메서드를 템플릿으로 사용하여 onPause(), onRestart(), onResume(), onStop(), onDestroy() 수명 주기 콜백을 구현합니다.

모든 콜백 메서드의 서명은 동일합니다(이름 제외). 이러한 다른 콜백 메서드를 만들기 위해 onStart()복사붙여넣기하는 경우 슈퍼클래스에서 올바른 메서드를 호출하도록 콘텐츠를 업데이트하고 올바른 메서드를 기록해야 합니다.

  1. 앱을 실행합니다.
  2. Android 스튜디오 하단에 있는 Logcat 탭을 클릭하면 Logcat 창이 표시됩니다. Activity가 시작될 때 전환된 세 가지 수명 주기 상태를 보여주는 로그 메시지 3개가 표시됩니다.
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 SecondActivity에서 수명 주기 콜백 구현

MainActivity의 수명 주기 콜백 메서드를 구현했으므로 이제 SecondActivity에도 동일한 작업을 실행합니다.

  1. SecondActivity를 엽니다.
  2. 클래스 상단에서 다음과 같이 LOG_TAG 변수의 상수를 추가합니다.
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. 두 번째 Activity에 수명 주기 콜백과 로그 구문을 추가합니다. MainActivity에서 콜백 메서드를 복사하고 붙여넣기할 수 있습니다.
  2. finish() 메서드 바로 앞 returnReply() 메서드에 로그 구문을 추가합니다.
Log.d(LOG_TAG, "End SecondActivity");

1.4 앱이 실행될 때 로그 관찰

  1. 앱을 실행합니다.
  2. Android 스튜디오 하단에 있는 Logcat 탭을 클릭하면 Logcat 창이 표시됩니다.
  3. 검색창에 Activity를 입력합니다. Android Logcat은 매우 길고 어수선할 수 있습니다. 각 클래스의 LOG_TAG 변수에는 MainActivity 또는 SecondActivity라는 단어가 포함되어 있으므로 이 키워드를 사용하면 관심 있는 항목으로만 로그를 필터링할 수 있습니다.

수명 주기 상태를 보여주는 로그

앱을 사용하여 실험하고 다양한 작업에 반응하여 발생하는 수명 주기 이벤트를 확인합니다. 특히 다음 작업을 시도해 보세요.

  • 앱을 정상적으로 사용합니다(메시지를 보내고 다른 메시지로 답장).
  • 뒤로 버튼을 사용하여 두 번째 Activity에서 기본 Activity로 돌아갑니다.
  • 앱 바에서 위쪽 화살표를 사용하여 두 번째 Activity에서 기본 Activity로 돌아갑니다.
  • 앱에서 다양한 시간에 기본 및 두 번째 Activity에서 모두 기기를 회전하고 로그와 화면이 어떻게 변경되는지 확인합니다.
  • 개요 버튼(홈 오른쪽의 정사각형 버튼)을 누르고 앱을 닫습니다(X 탭하기).
  • 홈 화면으로 돌아가 앱을 다시 시작합니다.

도움말: 에뮬레이터에서 앱을 실행하는 경우 Control+F11 또는 Control+Function+F11을 사용하여 회전을 시뮬레이션할 수 있습니다.

작업 1 솔루션 코드

다음 코드 스니펫은 첫 번째 작업의 솔루션 코드를 보여줍니다.

MainActivity

다음 코드 스니펫은 MainActivity에 추가된 코드를 보여주지만 전체 클래스는 보여주지 않습니다.

onCreate() 메서드:

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

        // Log the start of the onCreate() method.
        Log.d(LOG_TAG, "-------");
        Log.d(LOG_TAG, "onCreate");

        // Initialize all the view variables.
        mMessageEditText = findViewById(R.id.editText_main);
        mReplyHeadTextView = findViewById(R.id.text_header_reply);
        mReplyTextView = findViewById(R.id.text_message_reply);
}

다른 수명 주기 메서드:

@Override
protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
}

@Override
protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
}

@Override
protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
}

@Override
protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume");
}

@Override
protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
}

@Override
protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
}

SecondActivity

다음 코드 스니펫은 SecondActivity에 추가된 코드를 보여주지만 전체 클래스는 보여주지 않습니다.

SecondActivity 클래스 상단에서 다음을 실행합니다.

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

returnReply() 메서드:

public void returnReply(View view) {
        String reply = mReply.getText().toString();
        Intent replyIntent = new Intent();
        replyIntent.putExtra(EXTRA_REPLY, reply);
        setResult(RESULT_OK, replyIntent);
        Log.d(LOG_TAG, "End SecondActivity");
        finish();
}

다른 수명 주기 메서드:

위의 MainActivity와 동일합니다.

4. 작업 2: Activity 인스턴스 상태 저장 및 복원

시스템 리소스와 사용자 동작에 따라 앱의 각 Activity는 생각보다 훨씬 더 자주 소멸되고 재구성될 수 있습니다.

지난 섹션에서 기기나 에뮬레이터를 회전할 때 이 동작을 확인했을 수 있습니다. 기기 회전은 기기 구성 변경의 한 가지 예입니다. 회전이 가장 일반적이지만 모든 구성 변경은 현재 Activity를 소멸시키고 새 것처럼 다시 생성합니다. 코드에서 이 동작을 고려하지 않으면 구성 변경이 발생할 때 Activity 레이아웃이 기본 모양과 초깃값으로 되돌아갈 수 있어 사용자가 앱에서 위치나 데이터, 진행률 상태를 잃을 수 있습니다.

Activity의 상태는 Activity 인스턴스 상태라고 하는 Bundle 객체에 키-값 쌍의 집합으로 저장됩니다. 시스템은 Activity가 중지되기 직전에 기본 상태 정보를 인스턴스 상태 Bundle에 저장하고 해당 Bundle을 새 Activity 인스턴스에 전달하여 복원합니다.

예기치 않게 소멸되어 다시 생성될 때 Activity의 데이터가 손실되지 않도록 하려면 onSaveInstanceState() 메서드를 구현해야 합니다. 시스템은 Activity가 소멸되고 다시 생성될 가능성이 있는 경우 Activity(onPause()onStop() 사이)에서 이 메서드를 호출합니다.

인스턴스 상태에 저장하는 데이터는 현재 앱 세션 동안 이 특정 Activity의 이 인스턴스에만 적용됩니다. 새 앱 세션을 중지했다가 다시 시작하면 Activity 인스턴스 상태가 손실되고 Activity가 기본 모양으로 되돌아갑니다. 앱 세션 간에 사용자 데이터를 저장해야 하는 경우 공유 환경설정 또는 데이터베이스를 사용하세요. 이 둘 모두에 관해서는 이후 실습에서 알아봅니다.

2.1 onSaveInstanceState()로 Activity 인스턴스 상태 저장

기기를 회전해도 두 번째 Activity의 상태에 전혀 영향을 미치지 않습니다. 이는 두 번째 Activity 레이아웃과 상태가 레이아웃과 이를 활성화한 Intent에서 생성되기 때문입니다. Activity가 다시 만들어지더라도 Intent는 여전히 존재하며 해당 Intent의 데이터는 두 번째 ActivityonCreate() 메서드가 호출될 때마다 계속 사용됩니다.

또한 각 Activity에서 메시지 또는 답장 EditText 요소에 입력한 모든 텍스트는 기기가 회전해도 유지됩니다. 이는 레이아웃에 있는 일부 View 요소의 상태 정보가 구성 변경 시 자동으로 저장되고 EditText의 현재 값이 이러한 사례 중 하나이기 때문입니다.

따라서 관심 있는 Activity 상태는 기본 Activity에 있는 답장 헤더 및 답장 텍스트의 TextView 요소뿐입니다. 두 TextView 요소는 기본적으로 표시되지 않습니다. 두 번째 Activity에서 기본 Activity로 메시지를 다시 전송할 때만 표시됩니다.

이 작업에서는 onSaveInstanceState()를 사용하여 이러한 두 TextView 요소의 인스턴스 상태를 보존하는 코드를 추가합니다.

  1. MainActivity를 엽니다.
  2. onSaveInstanceState()의 이 스켈레톤 구현을 Activity에 추가하거나 Code > Override Methods를 사용하여 스켈레톤 재정의를 삽입합니다.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. 헤더가 현재 표시되는지 확인하고 표시되면 putBoolean() 메서드와 "reply_visible" 키를 사용하여 이 표시 상태를 Bundle 상태에 배치합니다.
    if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

답장 헤더와 텍스트는 두 번째 Activity에서 답장이 올 때까지 표시되지 않음으로 표시됩니다. 헤더가 표시되면 저장해야 하는 답장 데이터가 있는 것입니다. 여기서는 표시 상태에만 관심이 있습니다. 헤더의 실제 텍스트는 변경되지 않으므로 저장할 필요가 없습니다.

  1. 동일한 검사 내에서 답장 텍스트를 Bundle에 추가합니다.
outState.putString("reply_text",mReplyTextView.getText().toString());

헤더가 표시되면 답장 메시지 자체도 표시된다고 가정할 수 있습니다. 답장 메시지의 현재 표시 상태는 테스트하거나 저장하지 않아도 됩니다. 메시지의 실제 텍스트만 "reply_text" 키를 사용하여 Bundle 상태로 전환됩니다.

Activity가 생성된 후 변경될 수 있는 이러한 View 요소의 상태만 저장합니다. 앱의 다른 View 요소(EditText, Button)는 언제든지 기본 레이아웃에서 다시 만들 수 있습니다.

시스템은 EditText의 콘텐츠와 같은 일부 View 요소의 상태를 저장합니다.

2.2 onCreate()에서 Activity 인스턴스 상태 복원

Activity 인스턴스 상태를 저장한 후에는 Activity가 다시 생성될 때 상태를 복원해야 합니다. onCreate()에서 이를 실행하거나 Activity를 만든 후 onStart() 뒤에 호출되는 onRestoreInstanceState() 콜백을 구현하면 됩니다.

대부분의 경우 onCreate()Activity 상태를 복원하는 것이 더 낫습니다. 이렇게 하면 상태를 비롯한 UI를 가능한 한 빨리 사용할 수 있도록 할 수 있기 때문입니다. 때로는 모든 초기화가 완료된 후 onRestoreInstanceState()에서 실행하거나 서브클래스에서 기본 구현 사용 여부를 결정하도록 허용하는 것이 편리합니다.

  1. onCreate() 메서드에서 View 변수가 findViewById()로 초기화된 후 savedInstanceState가 null이 아님을 확인하는 테스트를 추가합니다.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);

// Restore the state.
if (savedInstanceState != null) {
}

Activity가 생성되면 시스템은 Bundle 상태를 onCreate()에 유일한 인수로 전달합니다. 처음 onCreate()가 호출되고 앱이 시작될 때 Bundlenull입니다. 앱이 처음 시작될 때는 기존 상태가 없습니다. 후속 onCreate() 호출에는 onSaveInstanceState()에 저장된 데이터로 채워진 번들이 있습니다.

  1. 이 검사 내에서 "reply_visible" 키를 사용하여 Bundle에서 현재 표시 상태(true 또는 false)를 가져옵니다.
if (savedInstanceState != null) {
    boolean isVisible =
                     savedInstanceState.getBoolean("reply_visible");
}
  1. isVisible 변수의 이전 줄 아래에 테스트를 추가합니다.
if (isVisible) {
}

상태 Bundlereply_visible 키가 있고 isVisibletrue이면 상태를 복원해야 합니다.

  1. isVisible 테스트 내에서 헤더가 표시되도록 합니다.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Bundle에서 "reply_text" 키를 사용하여 텍스트 답장 메시지를 가져오고 이 문자열을 표시하도록 답장 TextView를 설정합니다.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. 답장 TextView도 표시되도록 만듭니다.
mReplyTextView.setVisibility(View.VISIBLE);
  1. 앱을 실행합니다. 기기나 에뮬레이터를 회전해 보고 Activity가 다시 생성된 후에도 답장 메시지(있는 경우)가 화면에 유지되는지 확인합니다.

작업 2 솔루션 코드

다음 코드 스니펫은 이 작업의 솔루션 코드를 보여줍니다.

MainActivity

다음 코드 스니펫은 MainActivity에 추가된 코드를 보여주지만 전체 클래스는 보여주지 않습니다.

onSaveInstanceState() 메서드:

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   // If the heading is visible, message needs to be saved.
   // Otherwise we're still using default layout.
   if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
       outState.putBoolean("reply_visible", true);
       outState.putString("reply_text", 
                      mReplyTextView.getText().toString());
   }
}

onCreate() 메서드:

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

   Log.d(LOG_TAG, "-------");
   Log.d(LOG_TAG, "onCreate");

   // Initialize all the view variables.
   mMessageEditText = findViewById(R.id.editText_main);
   mReplyHeadTextView = findViewById(R.id.text_header_reply);
   mReplyTextView = findViewById(R.id.text_message_reply);

   // Restore the saved state. 
   // See onSaveInstanceState() for what gets saved.
   if (savedInstanceState != null) {
       boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
       // Show both the header and the message views. If isVisible is
       // false or missing from the bundle, use the default layout.
       if (isVisible) {
           mReplyHeadTextView.setVisibility(View.VISIBLE);
           mReplyTextView.setText(savedInstanceState
                                  .getString("reply_text"));
           mReplyTextView.setVisibility(View.VISIBLE);
       }
   }
}

전체 프로젝트:

Android 스튜디오 프로젝트: TwoActivitiesLifecycle

5. 코딩 도전과제

도전과제: 사용자가 빌드하는 목록에 관한 기본 활동과 일반적인 쇼핑 항목 목록에 관한 두 번째 활동이 포함된 간단한 쇼핑 목록 앱을 만듭니다.

  • 기본 활동에는 빌드할 목록이 포함되며 이 목록은 빈 TextView 요소 10개로 구성되어야 합니다.
  • 기본 활동의 Add Item 버튼은 일반적인 쇼핑 항목(Cheese, Rice, Apples 등) 목록이 포함된 두 번째 활동을 실행합니다. Button 요소를 사용하여 항목을 표시합니다.
  • 항목을 선택하면 사용자가 기본 활동으로 돌아가고 빈 TextView가 업데이트되어 선택된 항목이 포함됩니다.

Intent를 사용하여 한 Activity에서 다른 Activity로 정보를 전달합니다. 쇼핑 목록의 현재 상태는 사용자가 기기를 회전할 때 저장되어야 합니다.

6. 요약

  • Activity 수명 주기는 Activity가 이동하는 일련의 상태로, Activity가 처음 생성될 때 시작되어 Android 시스템이 Activity의 리소스를 회수할 때 끝납니다.
  • 사용자가 한 Activity에서 다른 Activity로 그리고 앱 안팎으로 이동할 때 각 ActivityActivity 수명 주기의 상태 간에 이동합니다.
  • Activity 수명 주기의 각 상태에는 Activity 클래스에서 재정의할 수 있는 상응하는 콜백 메서드가 있습니다.
  • 수명 주기 메서드는 onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy()입니다.
  • 수명 주기 콜백 메서드를 재정의하면 Activity가 해당 상태로 전환될 때 발생하는 동작을 추가할 수 있습니다.
  • Android 스튜디오에서 Code > Override를 사용하여 클래스에 스켈레톤 재정의 메서드를 추가할 수 있습니다.
  • 회전과 같은 기기 구성 변경으로 인해 Activity가 소멸되고 새 것처럼 다시 생성됩니다.
  • 일부 Activity 상태는 구성 변경 시 보존됩니다(EditText 요소의 현재 값 포함). 다른 모든 데이터의 경우 데이터를 직접 명시적으로 저장해야 합니다.
  • onSaveInstanceState() 메서드에 Activity 인스턴스 상태를 저장합니다.
  • 인스턴스 상태 데이터는 간단한 키-값 쌍으로 Bundle에 저장됩니다. 이 Bundle 메서드를 사용하여 데이터를 Bundle에 넣거나 Bundle에서 다시 가져옵니다.
  • onCreate()(권장됨) 또는 onRestoreInstanceState()에서 인스턴스 상태를 복원합니다.

7. 관련 개념

관련 개념 문서는 2.2: Activity 수명 주기 및 상태에 있습니다.

8. 자세히 알아보기

Android 스튜디오 문서:

Android 개발자 문서:

9. 과제

이 섹션에는 강사가 진행하는 과정의 일부로 이 Codelab을 진행하는 학생에게 출제할 수 있는 과제가 나열되어 있습니다. 다음 작업은 강사가 결정합니다.

  • 필요한 경우 과제를 할당합니다.
  • 과제 제출 방법을 학생에게 알립니다.
  • 과제를 채점합니다.

강사는 이러한 추천을 원하는 만큼 사용할 수 있으며 적절하다고 생각되는 다른 과제를 출제해도 됩니다.

이 Codelab을 직접 진행하는 경우 이러한 과제를 자유롭게 사용하여 배운 내용을 테스트해 보세요.

앱 빌드 및 실행

  1. 카운터 TextView, 카운터를 늘리는 Button, EditText가 있는 레이아웃으로 앱을 만듭니다. 아래 코드를 예시로 참고하세요. 레이아웃을 정확하게 복사하지 않아도 됩니다.
  2. 카운터를 늘리는 Button의 클릭 핸들러를 추가합니다.
  3. 앱을 실행하고 카운터를 증가시킵니다. EditText에 텍스트를 입력합니다.
  4. 기기를 회전합니다. 카운터가 재설정되지만 EditText는 재설정되지 않습니다.
  5. onSaveInstanceState()를 구현하여 앱의 현재 상태를 저장합니다.
  6. onCreate()를 업데이트하여 앱 상태를 복원합니다.
  7. 기기를 회전할 때 앱 상태가 유지되어야 합니다.

ebaf84570af6dd46.png

질문에 답하세요

질문 1

onSaveInstanceState()를 구현하기 전에 과제 앱을 실행하는 경우 기기를 회전하면 어떻게 되나요? 다음 중 하나를 선택하세요.

  • EditText에는 더 이상 입력된 텍스트가 포함되지 않지만 카운터는 유지됩니다.
  • 카운터가 0으로 재설정되고 EditText에는 더 이상 입력된 텍스트가 포함되지 않습니다.
  • 카운터가 0으로 재설정되지만 EditText의 콘텐츠는 유지됩니다.
  • 카운터와 EditText의 콘텐츠가 유지됩니다.

질문 2

기기 구성 변경(예: 회전)이 발생할 때 호출되는 Activity 수명 주기 메서드는 무엇인가요? 다음 중 하나를 선택하세요.

  • Android에서 onStop()을 호출하여 즉시 Activity를 종료합니다. 코드에서 Activity를 다시 시작해야 합니다.
  • Android에서 onPause(), onStop(), onDestroy()를 호출하여 Activity를 종료합니다. 코드에서 Activity를 다시 시작해야 합니다.
  • Android에서 onPause(), onStop(), onDestroy()를 호출하여 Activity를 종료한 다음 onCreate(), onStart(), onResume()을 호출하여 다시 시작합니다.
  • Android에서 즉시 onResume()을 호출합니다.

질문 3

Activity 수명 주기에서 onSaveInstanceState()는 언제 호출되나요? 다음 중 하나를 선택하세요.

  • onSaveInstanceState()onStop() 메서드 전에 호출됩니다.
  • onSaveInstanceState()onResume() 메서드 전에 호출됩니다.
  • onSaveInstanceState()onCreate() 메서드 전에 호출됩니다.
  • onSaveInstanceState()onDestroy() 메서드 전에 호출됩니다.

질문 4

Activity가 종료되거나 소멸되기 전에 데이터 저장에 사용할 가장 적합한 Activity 수명 주기 메서드는 무엇인가요? 다음 중 하나를 선택하세요.

  • onPause() 또는 onStop()
  • onResume() 또는 onCreate()
  • onDestroy()
  • onStart() 또는 onRestart()

채점을 위해 앱 제출

채점자를 위한 가이드

앱에 다음 기능이 있는지 확인합니다.

  • 카운터, 카운터를 늘리는 Button, EditText를 표시합니다.
  • Button을 클릭하면 카운터가 1씩 증가합니다.
  • 기기가 회전할 때 카운터와 EditText 상태가 모두 유지됩니다.
  • MainActivity.java의 구현은 onSaveInstanceState() 메서드를 사용하여 카운터 값을 저장합니다.
  • onCreate() 구현은 outState Bundle의 존재 여부를 테스트합니다. 해당 Bundle이 있으면 카운터 값이 복원되어 TextView에 저장됩니다.

10. 다음 Codelab

Android 개발자 기초(V2) 과정에서 유용한 다음 Codelab을 찾으려면 Android 개발자 기초(V2) Codelab을 참고하세요.

개념 챕터, 앱, 슬라이드 링크를 비롯한 과정 개요는 Android 개발자 기초(버전 2)를 참고하세요.