1. 환영합니다
소개
이 실습에서는 활동 수명 주기를 자세히 알아봅니다. 수명 주기는 활동이 생성될 때부터 소멸되고 시스템에서 리소스를 회수할 때까지 전체 기간 동안 활동이 있을 수 있는 일련의 상태입니다. 사용자가 앱에서 활동 간에 그리고 앱 안팎으로 이동함에 따라 활동은 수명 주기의 여러 상태 간에 전환됩니다.
활동 수명 주기의 각 단계에는 상응하는 콜백 메서드(onCreate()
, onStart()
, onPause()
등)가 있습니다. 활동이 상태를 변경하면 연결된 콜백 메서드가 호출됩니다. 이미 이러한 메서드 중 하나인 onCreate()
는 확인했습니다. Activity
클래스에서 수명 주기 콜백 메서드를 재정의하면 사용자 또는 시스템 작업에 응답하여 활동의 기본 동작을 변경할 수 있습니다.
활동 상태도 기기 구성 변경(예: 사용자가 기기를 세로 모드에서 가로 모드로 회전할 때)에 응답하여 변경될 수 있습니다. 이러한 구성 변경이 발생하면 활동이 소멸되고 기본 상태로 재생성되므로 사용자는 활동에 입력한 정보를 잃을 수 있습니다. 사용자에게 혼란을 주지 않기 위해 예기치 않은 데이터 손실을 방지하도록 앱을 개발하는 것이 중요합니다. 이 실습 후반부에서는 구성 변경을 실험하고 기기 구성 변경 및 기타 활동 수명 주기 이벤트에 응답하여 활동 상태를 보존하는 방법을 알아봅니다.
이 실습에서는 TwoActivities 앱에 로깅 문을 추가하고 앱을 사용하면서 활동 수명 주기 변경사항을 살펴봅니다. 그런 다음 이러한 변경사항을 적용하고 이러한 조건에서 사용자 입력을 처리하는 방법을 알아봅니다.
기본 요건
다음을 할 수 있어야 합니다.
- Android 스튜디오에서 앱 프로젝트를 만들고 실행합니다.
- 앱에 로그 구문을 추가하고 Logcat 창에서 이러한 로그를 확인합니다.
Activity
및Intent
를 이해하고 이를 활용하며 편안하게 상호작용할 수 있습니다.
학습할 내용
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에 콜백 구현
- Android 스튜디오에서 TwoActivities 프로젝트를 열고 Project > Android 창에서 MainActivity를 엽니다.
onCreate()
메서드에서 다음 로그 구문을 추가합니다.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- 해당 이벤트의 로그에 문과 함께
onStart()
콜백 재정의를 추가합니다.
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
바로가기의 경우 Android 스튜디오에서 Code > Override Methods를 선택합니다. 클래스에서 재정의할 수 있는 모든 메서드가 포함된 대화상자가 표시됩니다. 목록에서 콜백 메서드를 하나 이상 선택하면 슈퍼클래스에 대한 필수 호출을 비롯하여 해당 메서드의 전체 템플릿이 삽입됩니다.
onStart()
메서드를 템플릿으로 사용하여onPause()
,onRestart()
,onResume()
,onStop()
,onDestroy()
수명 주기 콜백을 구현합니다.
모든 콜백 메서드의 서명은 동일합니다(이름 제외). 이러한 다른 콜백 메서드를 만들기 위해 onStart()
를 복사 및 붙여넣기하는 경우 슈퍼클래스에서 올바른 메서드를 호출하도록 콘텐츠를 업데이트하고 올바른 메서드를 기록해야 합니다.
- 앱을 실행합니다.
- Android 스튜디오 하단에 있는 Logcat 탭을 클릭하면 Logcat 창이 표시됩니다.
Activity
가 시작될 때 전환된 세 가지 수명 주기 상태를 보여주는 로그 메시지 3개가 표시됩니다.
D/MainActivity: ------- D/MainActivity: onCreate D/MainActivity: onStart D/MainActivity: onResume
1.3 SecondActivity에서 수명 주기 콜백 구현
MainActivity
의 수명 주기 콜백 메서드를 구현했으므로 이제 SecondActivity
에도 동일한 작업을 실행합니다.
- SecondActivity를 엽니다.
- 클래스 상단에서 다음과 같이
LOG_TAG
변수의 상수를 추가합니다.
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- 두 번째
Activity
에 수명 주기 콜백과 로그 구문을 추가합니다.MainActivity
에서 콜백 메서드를 복사하고 붙여넣기할 수 있습니다. finish()
메서드 바로 앞returnReply()
메서드에 로그 구문을 추가합니다.
Log.d(LOG_TAG, "End SecondActivity");
1.4 앱이 실행될 때 로그 관찰
- 앱을 실행합니다.
- Android 스튜디오 하단에 있는 Logcat 탭을 클릭하면 Logcat 창이 표시됩니다.
- 검색창에 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
의 데이터는 두 번째 Activity
의 onCreate()
메서드가 호출될 때마다 계속 사용됩니다.
또한 각 Activity
에서 메시지 또는 답장 EditText
요소에 입력한 모든 텍스트는 기기가 회전해도 유지됩니다. 이는 레이아웃에 있는 일부 View
요소의 상태 정보가 구성 변경 시 자동으로 저장되고 EditText
의 현재 값이 이러한 사례 중 하나이기 때문입니다.
따라서 관심 있는 Activity
상태는 기본 Activity
에 있는 답장 헤더 및 답장 텍스트의 TextView
요소뿐입니다. 두 TextView
요소는 기본적으로 표시되지 않습니다. 두 번째 Activity
에서 기본 Activity
로 메시지를 다시 전송할 때만 표시됩니다.
이 작업에서는 onSaveInstanceState()
를 사용하여 이러한 두 TextView
요소의 인스턴스 상태를 보존하는 코드를 추가합니다.
- MainActivity를 엽니다.
onSaveInstanceState()
의 이 스켈레톤 구현을Activity
에 추가하거나 Code > Override Methods를 사용하여 스켈레톤 재정의를 삽입합니다.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- 헤더가 현재 표시되는지 확인하고 표시되면
putBoolean()
메서드와"reply_visible"
키를 사용하여 이 표시 상태를Bundle
상태에 배치합니다.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
답장 헤더와 텍스트는 두 번째 Activity
에서 답장이 올 때까지 표시되지 않음으로 표시됩니다. 헤더가 표시되면 저장해야 하는 답장 데이터가 있는 것입니다. 여기서는 표시 상태에만 관심이 있습니다. 헤더의 실제 텍스트는 변경되지 않으므로 저장할 필요가 없습니다.
- 동일한 검사 내에서 답장 텍스트를
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()
에서 실행하거나 서브클래스에서 기본 구현 사용 여부를 결정하도록 허용하는 것이 편리합니다.
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()
가 호출되고 앱이 시작될 때 Bundle
은 null
입니다. 앱이 처음 시작될 때는 기존 상태가 없습니다. 후속 onCreate()
호출에는 onSaveInstanceState()
에 저장된 데이터로 채워진 번들이 있습니다.
- 이 검사 내에서
"reply_visible"
키를 사용하여Bundle
에서 현재 표시 상태(true 또는 false)를 가져옵니다.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- isVisible 변수의 이전 줄 아래에 테스트를 추가합니다.
if (isVisible) {
}
상태 Bundle
에 reply_visible
키가 있고 isVisible
이 true
이면 상태를 복원해야 합니다.
isVisible
테스트 내에서 헤더가 표시되도록 합니다.
mReplyHeadTextView.setVisibility(View.VISIBLE);
Bundle
에서"reply_text"
키를 사용하여 텍스트 답장 메시지를 가져오고 이 문자열을 표시하도록 답장TextView
를 설정합니다.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- 답장
TextView
도 표시되도록 만듭니다.
mReplyTextView.setVisibility(View.VISIBLE);
- 앱을 실행합니다. 기기나 에뮬레이터를 회전해 보고
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로 그리고 앱 안팎으로 이동할 때 각Activity
는Activity
수명 주기의 상태 간에 이동합니다. 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을 직접 진행하는 경우 이러한 과제를 자유롭게 사용하여 배운 내용을 테스트해 보세요.
앱 빌드 및 실행
- 카운터
TextView
, 카운터를 늘리는Button
,EditText
가 있는 레이아웃으로 앱을 만듭니다. 아래 코드를 예시로 참고하세요. 레이아웃을 정확하게 복사하지 않아도 됩니다. - 카운터를 늘리는
Button
의 클릭 핸들러를 추가합니다. - 앱을 실행하고 카운터를 증가시킵니다.
EditText
에 텍스트를 입력합니다. - 기기를 회전합니다. 카운터가 재설정되지만
EditText
는 재설정되지 않습니다. onSaveInstanceState()
를 구현하여 앱의 현재 상태를 저장합니다.onCreate()
를 업데이트하여 앱 상태를 복원합니다.- 기기를 회전할 때 앱 상태가 유지되어야 합니다.
질문에 답하세요
질문 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)를 참고하세요.