diff options
Diffstat (limited to 'docs/html-intl/intl/ko/training/basics/activity-lifecycle')
5 files changed, 869 insertions, 0 deletions
diff --git a/docs/html-intl/intl/ko/training/basics/activity-lifecycle/index.jd b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/index.jd new file mode 100644 index 0000000..e66e8d1 --- /dev/null +++ b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/index.jd @@ -0,0 +1,72 @@ +page.title=액티비티 수명 주기 관리하기 +page.tags=activity lifecycle +helpoutsWidget=true + +trainingnavtop=true +startpage=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + + +<h2>종속관계 및 전제조건</h2> +<ul> + <li>Android 프로젝트를 생성하는 방법(<a href="{@docRoot}training/basics/firstapp/creating-project.html">Android +프로젝트 생성</a> 참조)</li> +</ul> + + +<h2>필독 항목</h2> +<ul> + <li><a href="{@docRoot}guide/components/activities.html">액티비티</a></li> +</ul> + + +<h2>실습하기</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> + <p class="filename">ActivityLifecycle.zip</p> +</div> + +</div> +</div> + +<p>사용자가 앱을 탐색하고, 앱에서 나가고, 앱으로 다시 돌아가면, 앱의 +{@link android.app.Activity} 인스턴스는 +수명 주기 안에서 서로 다른 상태 간에 전환됩니다. 예를 들어 +액티비티가 처음 시작되는 경우, 시스템의 전면에 표시되어 사용자의 +포커스를 받습니다. 이 과정에서 Android 시스템은 사용자 인터페이스 및 다른 구성요소에 설정된 +액티비티에 대해 일련의 수명 주기 메서드를 호출합니다. 사용자가 다른 액티비티를 시작하거나 다른 앱으로 전환하는 +작업을 수행하면, 백그라운드(액티비티가 더 +이상 보이지 않지만 인스턴스와 해당 상태는 그대로 유지되는 상태)로 전환되면서 시스템은 액티비티에 대해 또 다른 +수명 주기 메서드 세트를 호출합니다.</p> + +<p>사용자가 액티비티를 떠났다가 다시 돌아왔을 때 +액티비티가 어떤 식으로 동작할지에 대해 수명 주기 콜백 메서드 내에 선언할 수 있습니다. 예를 들어 스트리밍 비디오 플레이어를 구축하는 경우, +사용자가 다른 +앱으로 전환할 때 비디오를 일시정지하고 네트워크 연결을 종료할 수 있습니다. 사용자가 돌아오면, 네트워크를 다시 연결하고 사용자가 일시정지한 지점에서 +비디오를 다시 시작할 수 있게 할 수 있습니다.</p> + +<p>이 클래스에서는 각각의 {@link +android.app.Activity} 인스턴스가 수신하는 중요한 수명 주기 콜백 메서드를 설명합니다. 또한 이러한 콜백 메서드를 사용하여 액티비티가 +사용자가 원하는 작업을 하고, 액티비티가 필요로 하지 않을 때 시스템 리소스 소비를 방지하는 방법에 대해서도 설명합니다.</p> + +<h2>과정</h2> + +<dl> + <dt><b><a href="starting.html">액티비티 시작하기</a></b></dt> + <dd>액티비티 수명 주기의 기본사항, 사용자가 앱을 시작하는 방법, 그리고 기본 액티비티 생성 작업을 수행하는 +방법에 대해 설명합니다.</dd> + <dt><b><a href="pausing.html">액티비티 일시정지 및 재개하기</a></b></dt> + <dd>액티비티가 일시정지(부분적으로 가려져 있음)되었다가 재개되는 경우 어떤 동작이 발생하는지, 그리고 이러한 상태 전환 과정에서 수행해야 하는 +작업은 무엇인지 설명합니다.</dd> + <dt><b><a href="stopping.html">액티비티 정지 및 재시작하기</a></b></dt> + <dd>사용자가 액티비티를 완전히 떠났다가 돌아왔을 때 어떤 동작이 발생하는지 설명합니다.</dd> + <dt><b><a href="recreating.html">액티비티 재생성하기</a></b></dt> + <dd>액티비티가 소멸되면 어떤 동작이 발생하는지, 그리고 필요 시 액티비티 +상태를 재구축하는 방법에 대해 설명합니다.</dd> +</dl> + diff --git a/docs/html-intl/intl/ko/training/basics/activity-lifecycle/pausing.jd b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/pausing.jd new file mode 100644 index 0000000..b0497cd --- /dev/null +++ b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/pausing.jd @@ -0,0 +1,147 @@ +page.title=액티비티 일시정지 및 재개하기 +page.tags=activity lifecycle +helpoutsWidget=true + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>이 과정에서 다루는 내용</h2> + <ol> + <li><a href="#Pause">액티비티 일지정지하기</a></li> + <li><a href="#Resume">액티비티 재개하기</a></li> + </ol> + + <h2>필독 항목</h2> + <ul> + <li><a href="{@docRoot}guide/components/activities.html">액티비티</a> + </li> + </ul> + +<h2>실습하기</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> + <p class="filename">ActivityLifecycle.zip</p> +</div> + + </div> +</div> + +<p>일반적인 앱 사용 중에 가끔 다른 +비주얼 구성요소로 인해 전면의 액티비티가 <em>일시정지</em>되는 경우가 있습니다. 예를 들어, 대화 상자 스타일과 같은 반투명 +액티비티가 열리면, 그 이전 액티비티는 일시정지됩니다. 액티비티가 +부분적으로 보이지만 현재 포커스 내에 있지 않는 한 일시정지된 상태로 유지됩니다.</p> + +<p>하지만 액티비티가 보이지 않고 완전히 가려지면, <em>정지</em> 상태가 됩니다(이에 대해서는 +다음 과정에서 설명함).</p> + +<p>액티비티가 일시정지 상태로 전환되면 시스템은 {@link android.app.Activity}에 대해 {@link +android.app.Activity#onPause onPause()} 메서드를 호출합니다. 이를 통해 +비디오와 같이 일시정지되어 있는 동안에는 진행되어서는 안 되는 지속적인 작업을 정지하거나, 사용자가 앱에서 떠나더라도 영구 저장되어야 하는 정보를 +유지할 수 있습니다. 사용자가 +일시정지 상태에서 액티비티로 돌아오는 경우, 시스템은 액티비티를 재개하고 {@link android.app.Activity#onResume onResume()} 메서드를 +호출합니다.</p> + +<p class="note"><strong>참고:</strong> 액티비티가 {@link +android.app.Activity#onPause()}에 대한 호출을 수신하는 경우, 이는 액티비티가 +잠시 일시정지되는 것이며, 사용자가 이 액티비티로 포커스를 다시 돌릴 수 있음을 나타냅니다. 하지만 이는 일반적으로 사용자가 액티비티를 떠남을 나타내는 +첫 번째 표시입니다.</p> + +<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" /> +<p class="img-caption"><strong>그림 1.</strong> 액티비티를 +반투명 액티비티가 가릴 경우, 시스템은 {@link android.app.Activity#onPause onPause()}를 호출하고 액티비티는 일시정지된 상태로 +대기하게 됩니다(1). 사용자가 여전히 일시정지된 상태의 액티비티로 돌아오는 경우, +시스템은 {@link android.app.Activity#onResume onResume()}을 호출합니다(2).</p> + + +<h2 id="Pause">액티비티 일지정지하기</h2> + +<p>시스템이 액티비티에 대해 {@link android.app.Activity#onPause()}를 호출하면, 이는 +엄밀해 말해 액티비티가 여전히 부분적으로 보일 수 있음을 의미하지만, +대개의 경우 사용자가 액티비티를 떠나 곧 정지 상태로 전환될 것임을 나타냅니다. 일반적으로 다음 작업을 수행할 때 +{@link android.app.Activity#onPause()} 콜백을 사용해야 합니다.</p> + +<ul> + <li>애니메이션 또는 CPU 소비를 야기할 수 있는 기타 지속적인 작업 정지</li> + <li>저장되지 않은 변경 내용 커밋. 단, 사용자가 나갈 때 +이러한 변경 내용이 영구적으로 저장되기를 기대하는 경우에 한합니다(예: 이메일 임시저장).</li> + <li>브로드캐스트 리시버와 같은 시스템 리소스, GPS와 +같은 센서에 대한 핸들 또는 액티비티가 일지정지된 동안 배터리 수명에 영향을 미칠 수 있으며 사용자가 +필요로 하지 않는 모든 리소스 해제</li> +</ul> + +<p>예를 들어 애플리케이션이 {@link android.hardware.Camera}를 사용하는 경우 +{@link android.app.Activity#onPause()} 메서드는 이를 해제할 수 있는 좋은 위치입니다.</p> + +<pre> +@Override +public void onPause() { + super.onPause(); // Always call the superclass method first + + // Release the Camera because we don't need it when paused + // and other activities might need to use it. + if (mCamera != null) { + mCamera.release() + mCamera = null; + } +} +</pre> + +<p>일반적으로 폼에 입력된 개인 정보와 같은 +사용자의 변경 내용을 {@link android.app.Activity#onPause()}를 사용하여 영구 저장소에 저장하면 <strong>안 됩니다</strong>. 이메일 +임시보관과 같이 사용자가 자동저장을 원할 것이란 확신이 있을 경우에만 {@link android.app.Activity#onPause()} +내에서 사용자의 변경 내용을 영구 저장소에 유지해야 합니다. +하지만 데이터베이스에 쓰기와 같이 CPU를 많이 소모하는 작업은 {@link +android.app.Activity#onPause()} 중에는 수행하지 않아야 합니다. 그 이유는 이로 인해 다음 액티비티로 넘어가는 시각적 +전환이 느려질 수 있기 때문입니다(그 대신, 로드가 많은 셧다운 작업은 {@link android.app.Activity#onStop onStop()} +중에 수행해야 함).</p> + +<p>액티비티가 실제로 정지된 경우 사용자가 다음 +대상으로 신속하게 전환할 수 있도록 {@link android.app.Activity#onPause +onPause()} 메서드 내에서 수행되는 작업의 양을 비교적 단순하게 유지해야 합니다.</p> + +<p class="note"><strong>참고:</strong> 액티비티가 일시정지되면 {@link +android.app.Activity} 인스턴스는 메모리에 계속 유지되며, 액티비티가 재개되면 다시 호출됩니다. +최상위 상태가 재개됨 상태인 콜백 메서드 중에 +생성된 구성요소는 다시 초기화할 필요가 없습니다.</p> + + + +<h2 id="Resume">액티비티 재개하기</h2> + +<p>사용자가 일시정지됨 상태에서 액티비티를 재개하면, 시스템은 {@link +android.app.Activity#onResume()} 메서드를 호출합니다.</p> + +<p>액티비티가 처음 생성되는 경우를 +포함하여 액티비티가 전면에 표시될 때마다 시스템이 이 메서드를 호출한다는 것을 유의해야 합니다. 이와 같이, {@link +android.app.Activity#onResume()}을 구현하여 {@link +android.app.Activity#onPause()} 중에 해제하는 구성요소를 초기화하고, 액티비티가 +재개됨 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 합니다(예: 애니메이션 시작 및 액티비티가 사용자 포커스를 받을 때에만 +사용되는 구성 요소 초기화).</p> + +<p>다음 {@link android.app.Activity#onResume()} 예제는 위에 표시된 +{@link android.app.Activity#onPause()} 예제와 대응관계에 있습니다. 따라서 이 예제에서는 액티비티가 일시정지될 때 +해제되는 카메라를 초기화합니다.</p> + +<pre> +@Override +public void onResume() { + super.onResume(); // Always call the superclass method first + + // Get the Camera instance as the activity achieves full user focus + if (mCamera == null) { + initializeCamera(); // Local method to handle camera init + } +} +</pre> + + + + + + + diff --git a/docs/html-intl/intl/ko/training/basics/activity-lifecycle/recreating.jd b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/recreating.jd new file mode 100644 index 0000000..79fb92b --- /dev/null +++ b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/recreating.jd @@ -0,0 +1,178 @@ +page.title=액티비티 재생성하기 +page.tags=activity lifecycle +helpoutsWidget=true + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>이 과정에서 다루는 내용</h2> + <ol> + <li><a href="#SaveState">액티비티 상태 저장하기</a></li> + <li><a href="#RestoreState">액티비티 상태 복원하기</a></li> + </ol> + + <h2>필독 항목</h2> + <ul> + <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">다양한 +화면 지원</a></li> + <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리하기</a></li> + <li><a href="{@docRoot}guide/components/activities.html">액티비티</a> + </li> + </ul> + + </div> +</div> + +<p>정상적인 앱 동작으로 인해 액티비티가 소멸되는 몇 가지 시나리오가 있습니다. +예를 들어 사용자가 <em>뒤로</em> 버튼을 누르거나 액티비티가 {@link android.app.Activity#finish()}를 호출하여 +자체적인 소멸 신호를 보내는 경우입니다. 또한 액티비티가 +현재 정지되어 있고 장시간 사용되지 않거나, 전면에 있는 액티비티가 더 많은 +리소스를 필요로 하여 시스템이 백그라운드 프로세스를 종료해서 메모리를 회수해야 하는 경우에도 시스템이 액티비티를 소멸시킬 수 있습니다.</p> + +<p>사용자가 <em>뒤로</em> 버튼을 누르거나 액티비티가 +스스로 종료되어 소멸된 경우, {@link android.app.Activity} 인스턴스에 대한 시스템의 개념은 완전히 사라지게 됩니다. 왜냐하면 +동작이 액티비티가 더 이상 필요치 않다는 것을 나타내기 때문입니다. 하지만 시스템이 정상적인 앱 동작이 아닌 시스템 제약 조건으로 인해 +액티비티를 소멸한 경우, 실제 +{@link android.app.Activity} 인스턴스는 사라지지만 시스템은 그것이 존재하고 있었음을 기억합니다. 예를 들어 +사용자가 다시 해당 액티비티를 탐색하면, 시스템은 소멸된 액티비티의 상태를 설명하는 +저장된 데이터 세트를 사용하여 액티비티의 새 인스턴스를 생성합니다. 시스템이 +이전 상태를 복원하기 위해 사용하는 저장된 데이터를 "인스턴스 상태"라고 하며, 이는 {@link android.os.Bundle} 개체에 저장된 +키-값 쌍의 컬렉션입니다.</p> + +<p class="caution"><strong>주의:</strong> 사용자가 화면을 회전할 때마다 +액티비티가 소멸되고 재생성됩니다. 화면 방향이 바뀌면 시스템은 +전면에 있는 액티비티를 소멸하고 재생성합니다. 그 이유는 화면 구성이 바뀌었으며, 액티비티가 레이아웃과 같은 대체 리소스를 +로딩해야 할 수 있기 때문입니다.</p> + +<p>기본적으로 시스템은 {@link android.os.Bundle} 인스턴스 상태를 사용하여 액티비티 레이아웃의 각 {@link android.view.View} 개체에 대한 +정보를 저장합니다(예: {@link android.widget.EditText} 개체에 +입력된 텍스트 값 등). 따라서 액티비티 인스턴스가 소멸되고 +재생성된 경우, 레이아웃의 상태는 +별도의 코드 요청 없이 이전 상태로 복원됩니다. 하지만 +액티비티에서 사용자 진행 상태를 +추적하는 멤버 변수처럼 액티비티에 복원하고자 하는 상태 정보가 더 많이 있는 경우도 있습니다.</p> + +<p class="note"><strong>참고:</strong> Android 시스템이 액티비티에서 +보기의 상태를 복원하기 위해서는 +<a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code +android:id}</a> 특성으로 제공되는 <strong>고유 ID가 각 보기마다 있어야 합니다</strong>.</p> + +<p>액티비티 상태에 대한 추가 데이터를 저장하려면 +{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} 콜백 메서드를 재정의해야 합니다. +시스템은 사용자가 액티비티를 떠날 경우 이 메서드를 호출하며, +액티비티가 예기치 않게 소멸될 경우 저장되는 +{@link android.os.Bundle} 개체로 전달합니다. 시스템이 +나중에 액티비티 인스턴스를 재생성해야 하는 경우, 동일한 {@link +android.os.Bundle} 개체를 {@link android.app.Activity#onRestoreInstanceState +onRestoreInstanceState()} 및 {@link android.app.Activity#onCreate onCreate()} +메서드 모두에 전달합니다.</p> + +<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" /> +<p class="img-caption"><strong>그림 2.</strong> 시스템은 액티비티 중지 작업을 시작할 때 +{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1)를 호출합니다. +따라서 {@link android.app.Activity} 인스턴스가 +재생성되어야 하는 경우 저장하고자 하는 추가 상태 데이터를 지정할 수 있습니다. +액티비티가 소멸되고 동일한 인스턴스가 재생성되어야 하는 경우, 시스템은 {@link android.app.Activity#onCreate onCreate()} 메서드(2) +및 {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 메서드(3) +모두에 (1)에서 정의된 상태 +데이터를 전달합니다.</p> + + + +<h2 id="SaveState">액티비티 상태 저장하기</h2> + +<p>액티비티의 정지 작업 시작 시 시스템은 {@link android.app.Activity#onSaveInstanceState +onSaveInstanceState()}를 호출합니다. 이에 따라 액티비티는 키-값 +쌍 컬렉션과 함께 상태 정보를 저장할 수 있습니다. 메서드의 기본 구현은 {@link android.widget.EditText} 위젯 내 텍스트 또는 {@link android.widget.ListView}의 스크롤 +위치와 같은 액티비티의 +보기 계층 구조에 대한 정보를 저장합니다.</p> + +<p>액티비티에 대한 추가 상태 정보를 저장하려면 {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}를 +구현한 다음 {@link android.os.Bundle} 개체에 +키-값 쌍을 추가해야 합니다. 예를 들면 다음과 같습니다.</p> + +<pre> +static final String STATE_SCORE = "playerScore"; +static final String STATE_LEVEL = "playerLevel"; +... + +@Override +public void onSaveInstanceState(Bundle savedInstanceState) { + // Save the user's current game state + savedInstanceState.putInt(STATE_SCORE, mCurrentScore); + savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); + + // Always call the superclass so it can save the view hierarchy state + super.onSaveInstanceState(savedInstanceState); +} +</pre> + +<p class="caution"><strong>주의:</strong> 항상 {@link +android.app.Activity#onSaveInstanceState onSaveInstanceState()}의 슈퍼클래스 구현을 호출하여 기본 구현에서 +보기 계층 구조를 저장할 수 있도록 합니다.</p> + + + +<h2 id="RestoreState">액티비티 상태 복원하기</h2> + +<p>액티비티가 이전에 소멸된 후 재생성되면, 시스템이 액티비티를 +전달한 {@link android.os.Bundle}로부터 저장된 +상태를 복구할 수 있습니다. {@link android.app.Activity#onCreate onCreate()} 및 {@link +android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 콜백 메서드 둘 다 인스턴스 상태 정보를 포함하는 +동일한 {@link android.os.Bundle}을 수신합니다.</p> + +<p>{@link android.app.Activity#onCreate onCreate()} 메서드는 +시스템이 액티비티의 새 인스턴스를 생성하든, 이전 인스턴스를 재생성하든 상관없이 호출되므로, 읽기를 시도하기 전에 상태 {@link android.os.Bundle}이 null인지 +반드시 확인해야 합니다. null일 경우, +시스템은 이전에 소멸된 액티비티의 인스턴스를 +복원하지 않고 새 인스턴스를 생성합니다.</p> + +<p>다음은 {@link android.app.Activity#onCreate +onCreate()}에서 몇 가지 상태 데이터를 복원하는 방법에 대한 예제입니다.</p> + +<pre> +@Override +protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); // Always call the superclass first + + // Check whether we're recreating a previously destroyed instance + if (savedInstanceState != null) { + // Restore value of members from saved state + mCurrentScore = savedInstanceState.getInt(STATE_SCORE); + mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); + } else { + // Probably initialize members with default values for a new instance + } + ... +} +</pre> + +<p>{@link android.app.Activity#onCreate onCreate()} 중에 상태를 복원하는 +대신, 시스템이 {@link android.app.Activity#onStart()} 메서드 후에 +호출하는 {@link +android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}를 구현하도록 선택할 수 있습니다. 시스템은 복원할 저장 +상태가 있을 경우에만 {@link +android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}를 호출합니다. 따라서 {@link android.os.Bundle}이 null인지 확인할 필요가 없습니다.</p> + +<pre> +public void onRestoreInstanceState(Bundle savedInstanceState) { + // Always call the superclass so it can restore the view hierarchy + super.onRestoreInstanceState(savedInstanceState); + + // Restore state members from saved instance + mCurrentScore = savedInstanceState.getInt(STATE_SCORE); + mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); +} +</pre> + +<p class="caution"><strong>주의:</strong> 항상 {@link +android.app.Activity#onSaveInstanceState onSaveInstanceState()}의 슈퍼클래스 구현을 호출하여 기본 구현에서 보기 계층 구조의 상태를 +복원할 수 있도록 합니다.</p> + +<p>런타임에 +재시작 이벤트로 인한 액티비티 재생성과 관련한 자세한 내용은 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리하기</a>를 참조하세요.</p> + diff --git a/docs/html-intl/intl/ko/training/basics/activity-lifecycle/starting.jd b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/starting.jd new file mode 100644 index 0000000..71ecf06 --- /dev/null +++ b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/starting.jd @@ -0,0 +1,285 @@ +page.title=액티비티 시작하기 +page.tags=activity lifecycle +helpoutsWidget=true + +trainingnavtop=true + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>이 과정에서 다루는 내용</h2> +<ol> + <li><a href="#lifecycle-states">수명 주기 콜백 이해하기</a></li> + <li><a href="#launching-activity">앱 시작 관리자 액티비티 지정하기</a></li> + <li><a href="#Create">새로운 인스턴스 생성하기</a></li> + <li><a href="#Destroy">액티비티 소멸하기</a></li> +</ol> + + <h2>필독 항목</h2> + <ul> + <li><a href="{@docRoot}guide/components/activities.html">액티비티</a></li> + </ul> + +<h2>실습하기</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> + <p class="filename">ActivityLifecycle.zip</p> +</div> + + </div> +</div> + +<p>{@code main()} 메서드로 앱이 실행되는 다른 프로그래밍 패러다임과는 달리, +Android 시스템은 {@link android.app.Activity} 인스턴스 수명 주기의 특정 단계에 부합하는 특정 +콜백 메서드를 호출하여 해당 인스턴스 내 코드를 +실행합니다. 액티비티를 시작하는 순차적인 콜백 메서드가 있으며, 액티비티를 소멸시키는 +순차적인 콜백 메서드가 있습니다.</p> + +<p>이 과정에서는 가장 중요한 수명 주기 메서드에 대해 간략히 설명하며, 액티비티의 새 인스턴스를 생성하는 첫 번째 수명 주기 콜백을 +처리하는 방법을 보여줍니다.</p> + + + +<h2 id="lifecycle-states">수명 주기 콜백 이해하기</h2> + +<p>액티비티 수명 동안, 시스템은 계단식 피라미드와 비슷하게 수명 주기 메서드의 핵심 세트를 +순차적으로 호출합니다. 즉, +액티비티 수명 주기의 각 단계는 피라미드의 각 계단과 같습니다. 시스템이 새 액티비티 인스턴스를 생성하면, +각각의 콜백 메서드는 액티비티 상태를 한 단계 상향 이동합니다. 피라미드의 최상층은 +액티비티가 전면에서 실행 중이며 사용자가 이러한 액티비티와 상호 작용할 수 있는 단계를 뜻합니다.</p> + +<p>사용자가 액티비티를 나가면, 시스템은 액티비티를 해체하기 위해 액티비티 +상태를 피라미드에서 하향 이동하는 다른 메서드를 호출합니다. 경우에 따라, 액티비티가 +피라미드에서 완전히 하향 이동되지 않고 기다립니다(예: 사용자가 다른 앱으로 전환한 경우). 이런 경우, +액티비티는 다시 피라미드 최상층으로 상향 이동될 수 있으며(사용자가 액티비티로 돌아갈 경우), 사용자는 종료한 지점에서 +작업을 재개할 수 있습니다.</p> + + +<img src="{@docRoot}images/training/basics/basic-lifecycle.png" /> +<p class="img-caption"><strong>그림 1.</strong> 액티비티 +수명 주기를 계단식 피라미드로 간략하게 표현한 그림. 이 그림에서는 최상층에 있는 +재개됨(Resumed) 상태를 향하여 액티비티를 한 단계 상향 이동하는 데 사용되는 각 콜백마다 하위 단계로 +액티비티를 하향 이동하는 콜백 메서드가 있음을 보여줍니다. 액티비티는 +일시정지됨(Paused) 및 정지됨(Stopped) 상태에서도 재개 상태로 돌아갈 수 있습니다.</p> + + +<p>액티비티의 복잡한 정도에 따라, 모든 +수명 주기 메서드를 구현할 필요가 없는 경우도 있습니다. 하지만 각각의 수명 주기 메서드를 이해하고, 사용자가 예상한 대로 +앱이 동작하도록 필요한 수명 주기 메서드를 구현하는 것이 중요합니다. 액티비티 수명 주기 메서드를 올바르게 구현하면, 다음을 포함하여 여러 가지 방법으로 앱이 제대로 동작하도록 +보장할 수 있습니다.</p> +<ul> + <li>사용자가 앱을 사용하는 +도중에 전화가 걸려오거나 다른 앱으로 전환할 때 충돌하지 않도록 합니다.</li> + <li>사용자가 앱을 활발하게 사용하지 않는 경우, 소중한 시스템 리소스를 소비하지 +않도록 합니다.</li> + <li>사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태를 +손실하지 않도록 합니다.</li> + <li>화면이 가로 방향과 세로 방향 간에 회전할 경우, 충돌하거나 사용자의 +진행 상태를 손실하지 않도록 합니다.</li> +</ul> + +<!-- +<p class="table-caption"><strong>Table 1.</strong> Activity lifecycle state pairs and callback +methods.</p> +<table> + <tr> + <th scope="col">Lifecycle State</th> + <th scope="col">Startup Method</th> + <th scope="col">Teardown Method</th> + </tr> + <tr> + <td>Created / Destroyed</td> + <td>{@link android.app.Activity#onCreate onCreate()}</td> + <td>{@link android.app.Activity#onDestroy()}</td> + </tr> + <tr> + <td>Started / Stopped</td> + <td>{@link android.app.Activity#onStart()}</td> + <td>{@link android.app.Activity#onStop()}</td> + </tr> + <tr> + <td>Resumed / Resumed</td> + <td>{@link android.app.Activity#onResume()}</td> + <td>{@link android.app.Activity#onPause()}</td> + </tr> +</table> +--> + +<p>다음 과정에서 확인할 수 있듯이, 액티비티가 그림 1에 나와 있는 상태 간을 +전환하는 여러 가지 상황이 있습니다. 하지만, 이들 상태 +중 세 가지만 유일하게 정적일 수 있습니다. 즉, 액티비티는 +이 세 가지 상태에 한하여 그중 하나에서 장시간 동안 존재할 수 있습니다.</p> +<dl> + <dt>재개됨(Resumed)</dt> + <dd>이 상태에서는 액티비티가 전면에 있으며 사용자가 액티비티와 상호 작용할 수 +있습니다(경우에 따라 "실행 중" 상태라고도 함).</dd> + <dt>일시정지됨(Paused)</dt> + <dd>이 상태에서는 액티비티가 다른 액티비티로 인해 부분적으로 가려져 있습니다. 이런 경우, 전면에 있는 +다른 액티비티는 반투명이거나 전체 화면을 차지하지 않습니다. 일시정지된 +액티비티는 사용자 입력을 받지 않으며, 어떠한 코드도 실행할 수 없습니다. + <dt>정지됨(Stopped)</dt> + <dd>이 상태에서는 액티비티가 완전히 가려져서 사용자에게 보이지 않습니다. 이 상태는 액티비티가 백그라운드에 있는 것으로 +간주됩니다. 정지되어 있는 동안 액티비티 인스턴스 및 멤버 변수와 같은 모든 상태 +정보가 유지되지만, 어떠한 코드도 실행할 수 없습니다.</dd> +</dl> + +<p>이외의 상태(생성됨(Created) 및 시작됨(Started))는 일시적이며, 시스템은 다음 수명 주기 콜백 메서드를 호출하여 +다음 상태로 신속하게 전환합니다. 즉, 시스템은 +{@link android.app.Activity#onCreate onCreate()}를 호출한 후 바로 {@link +android.app.Activity#onStart()}를 호출하고, 또 그 즉시 {@link +android.app.Activity#onResume()}을 호출합니다.</p> + +<p>이것으로 기본적인 액티비티 수명 주기에 대한 설명을 마칩니다. 이제, +구체적인 수명 주기 동작에 대해 알아보도록 하겠습니다.</p> + + + +<h2 id="launching-activity">앱 시작 관리자 액티비티 지정하기</h2> + +<p>사용자가 홈 화면에서 앱 아이콘을 선택하면, 시스템이 앱에서 "시작 관리자"(또는 "메인") 액티비티로 선언한 {@link android.app.Activity}에 대한 {@link +android.app.Activity#onCreate onCreate()} 메서드를 +호출합니다. 이 액티비티는 앱의 사용자 인터페이스에 대한 +주 진입점 역할을 합니다.</p> + +<p>Android 매니페스트 파일인 <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">{@code AndroidManifest.xml}</a>에 메인 액티비티로 사용할 액티비티를 정의할 수 있습니다. 이 파일은 +프로젝트 디렉터리의 루트에 있습니다.</p> + +<p>앱의 메인 액티비티는 {@link +android.content.Intent#ACTION_MAIN MAIN} 작업 및{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} 카테고리를 포함하는 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code +<intent-filter>}</a>와 함께 +매니페스트 파일에 선언되어야 합니다. 예를 들면 다음과 같습니다.</p> + +<pre> +<activity android:name=".MainActivity" android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> +</activity> +</pre> + +<p class="note"><strong>참고:</strong> Android SDK +Tools를 사용하여 새 Android 프로젝트를 생성하는 경우, 매니페스트에서 이 필터와 함께 +선언된 {@link android.app.Activity} 클래스가 기본 프로젝트 파일에 포함됩니다.</p> + +<p>{@link android.content.Intent#ACTION_MAIN MAIN} 작업 또는 +{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} 카테고리가 +액티비티 중 하나에 대해 선언되어 있지 않을 경우, 홈 화면의 앱 목록에 앱 아이콘이 표시되지 않습니다.</p> + + + +<h2 id="Create">새로운 인스턴스 생성하기</h2> + +<p>대부분의 앱은 사용자가 다양한 작업을 수행할 수 있도록 여러 액티비티를 포함하고 있습니다. +액티비티가 사용자가 앱 아이콘을 클릭할 때 생성되는 메인 액티비티든, 사용자 작업에 +대한 응답으로 앱이 시작하는 다른 액티비티든 간에, +시스템은 {@link +android.app.Activity#onCreate onCreate()} 메서드를 호출하여 매번 {@link android.app.Activity}의 새 인스턴스를 생성합니다.</p> + +<p>액티비티의 전체 수명 주기 동안 한 번만 발생하는 기본 +애플리케이션 시작 논리를 수행하도록 {@link android.app.Activity#onCreate onCreate()} 메서드를 구현해야 합니다. 예를 +들어 {@link android.app.Activity#onCreate onCreate()}의 구현은 +사용자 인터페이스를 정의해야 하며, 몇몇 클래스 범위의 변수를 인스턴스화해야 할 수 있습니다.</p> + +<p>예를 들어 다음 {@link android.app.Activity#onCreate onCreate()} +메서드에 대한 예제는 +사용자 인터페이스 선언(XML 레이아웃 파일에 정의), 멤버 변수 정의, +몇몇 UI 구성과 같은 액티비티에 대한 몇 가지 기본 설정을 수행하는 코드를 보여줍니다.</p> + +<pre> +TextView mTextView; // Member variable for text view in the layout + +@Override +public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Set the user interface layout for this Activity + // The layout file is defined in the project res/layout/main_activity.xml file + setContentView(R.layout.main_activity); + + // Initialize member TextView so we can manipulate it later + mTextView = (TextView) findViewById(R.id.text_message); + + // Make sure we're running on Honeycomb or higher to use ActionBar APIs + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + // For the main activity, make sure the app icon in the action bar + // does not behave as a button + ActionBar actionBar = getActionBar(); + actionBar.setHomeButtonEnabled(false); + } +} +</pre> + +<p class="caution"><strong>주의:</strong> {@link android.os.Build.VERSION#SDK_INT}를 사용하여 +이전 시스템이 새 API를 실행하지 못하도록 방지하는 방법은 Android 2.0(API 레벨 +5) 이상에서만 가능합니다. 이전 버전에서는 런타임 예외가 발생합니다.</p> + +<p>{@link android.app.Activity#onCreate onCreate()}가 실행을 마치면 시스템은 +{@link android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()} 메서드를 +연달아 호출합니다. 액티비티가 생성됨(Created) 또는 시작됨(Started) 상태에서 머무르는 경우는 없습니다. 엄밀히 말하면 +{@link android.app.Activity#onStart()}가 호출되면 액티비티가 사용자에게 보이지만, +{@link android.app.Activity#onResume()}이 바로 뒤따르고, 어떠한 상황(예: 전화가 오거나, +사용자가 다른 액티비티로 전환하거나, 기기 화면이 꺼진 경우)이 발생하기 전까지는 액티비티가 +재개됨(Resumed) 상태로 유지됩니다.</p> + +<p>앞으로 진행되는 과정에서는 다른 시작 메서드인 {@link +android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()}이 일시정지됨(Paused) 또는 정지됨(Stopped) 상태에서 +액티비티를 재개하기 위해 사용된 경우 액티비티의 수명 주기 동안 어떤 식으로 유용한지에 대해 설명합니다.</p> + +<p class="note"><strong>참고:</strong> {@link android.app.Activity#onCreate onCreate()} +메서드는 <code>savedInstanceState</code>라고 하는 매개변수를 포함합니다. 이 매개변수는 <a href="recreating.html">액티비티 재생성하기</a>에 대한 +마지막 과정에서 설명합니다.</p> + + +<img src="{@docRoot}images/training/basics/basic-lifecycle-create.png" /> +<p class="img-caption"><strong>그림 2.</strong> 액티비티의 새 인스턴스를 생성할 때 +시스템이 순차적으로 호출하는 {@link android.app.Activity#onCreate onCreate()}, {@link android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()}의 +세 가지 메인 콜백을 강조하여 보여주는 액티비티의 수명 주기 구조에 +대한 또 다른 그림. 이러한 순차적인 +콜백이 완료되면, 액티비티는 재개됨(Resumed) 상태가 됩니다. 이 상태에서는 사용자가 다른 +액티비티로 전환하기 전까지 사용자가 액티비티와 상호 작용할 수 있습니다.</p> + + + + + + + +<h2 id="Destroy">액티비티 소멸하기</h2> + +<p>액티비티의 첫 번째 수명 주기 콜백은 {@link android.app.Activity#onCreate +onCreate()}이고, 마지막 콜백은 {@link android.app.Activity#onDestroy}입니다. 시스템은 +시스템 메모리에서 액티비티 인스턴스가 완전히 제거된다는 내용의 마지막 +신호로 액티비티에서 이 메서드를 호출합니다.</p> + +<p>대부분의 앱은 이 메서드를 구현할 필요가 없습니다. 왜냐하면 액티비티와 +함께 로컬 클래스 참조가 소멸되고, 액티비티가 {@link +android.app.Activity#onPause} 및 {@link android.app.Activity#onStop} 중에 대부분 정리 작업을 수행하기 때문입니다. 하지만 +액티비티가 {@link +android.app.Activity#onCreate onCreate()} 중에 생성한 백그라운드 스레드 또는 제대로 닫지 않으면 메모리 누수를 +야기할 수 있는 다른 장시간 실행되는 리소스를 포함하는 경우, {@link +android.app.Activity#onDestroy} 중에 액티비티를 중단시켜야 합니다.</p> + +<pre> +@Override +public void onDestroy() { + super.onDestroy(); // Always call the superclass + + // Stop method tracing that the activity started during onCreate() + android.os.Debug.stopMethodTracing(); +} +</pre> + +<p class="note"><strong>참고:</strong> 시스템은 한 가지 경우, +즉 {@link android.app.Activity#onCreate onCreate()} 메서드에서 {@link +android.app.Activity#finish()}를 호출하는 경우를 제외하고는, {@link android.app.Activity#onPause} 및 {@link +android.app.Activity#onStop}을 먼저 호출한 후에 {@link android.app.Activity#onDestroy}를 +호출합니다. 경우에 따라(예: 액티비티가 다른 액티비티를 +실행하기 위한 임시 의사 결정자 역할을 할 경우), {@link +android.app.Activity#onCreate onCreate()} 내에서 {@link android.app.Activity#finish()}를 호출하여 액티비티를 소멸시킬 수도 있습니다. 이 경우, 시스템이 +다른 수명 주기 메서드를 호출하지 않고 즉시 +{@link android.app.Activity#onDestroy}를 호출합니다.</p> diff --git a/docs/html-intl/intl/ko/training/basics/activity-lifecycle/stopping.jd b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/stopping.jd new file mode 100644 index 0000000..79e713a --- /dev/null +++ b/docs/html-intl/intl/ko/training/basics/activity-lifecycle/stopping.jd @@ -0,0 +1,187 @@ +page.title=액티비티 정지 및 재시작하기 +page.tags=activity lifecycle +helpoutsWidget=true + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>이 과정에서 다루는 내용</h2> + <ol> + <li><a href="#Stop">액티비티 정지하기</a></li> + <li><a href="#Start">액티비티 시작/재시작하기</a></li> + </ol> + + <h2>필독 항목</h2> + <ul> + <li><a href="{@docRoot}guide/components/activities.html">액티비티</a> + </li> + </ul> + +<h2>실습하기</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> + <p class="filename">ActivityLifecycle.zip</p> +</div> + + </div> +</div> + +<p>액티비티 수명 주기에서 액티비티를 제대로 정지하고 재시작하는 것은 중요한 프로세스입니다. +그래야만 사용자가 앱이 항상 작동 상태를 유지하고 진행 상태를 손실하지 않는다고 인식하도록 할 수 있습니다. +다음과 같이 액티비티가 정지되었다가 재시작되는 몇 가지 중요한 시나리오가 있습니다.</p> + +<ul> + <li>사용자가 최근 앱 창을 열고 다른 액티비티로 전환하면 현재 전면에 있는 앱의 +액티비티가 정지됩니다. 사용자가 홈 화면 시작 관리자 아이콘 또는 최근 앱 창에서 +앱으로 돌아오면 액티비티가 재시작됩니다.</li> + <li>사용자가 앱에서 새 액티비티를 시작하는 작업을 수행합니다. 두 번째 액티비티가 +생성되면 현재 액티비티가 정지됩니다. 사용자가 <em>뒤로</em> +버튼을 누르면 첫 번째 액티비티가 재시작됩니다.</li> + <li>사용자가 앱을 사용하는 도중에 전화가 걸려옵니다.</li> +</ul> + +<p>{@link android.app.Activity} 클래스는 두 가지 수명 주기 메서드인 {@link +android.app.Activity#onStop()} 및 {@link android.app.Activity#onRestart()}를 제공합니다. 이 메서드를 사용하면 액티비티의 정지 및 재시작 처리 방법을 +명확하게 지정할 수 있습니다. 부분적인 UI 차단을 식별하는 +일시정지됨 상태와 달리, 정지됨 상태는 UI가 더 이상 보이지 않으며, +사용자의 포커스가 별도의 액티비티 또는 완전히 별도의 앱에 있음을 보장합니다.</p> + +<p class="note"><strong>참고:</strong> {@link android.app.Activity} +인스턴스가 정지되면 시스템이 이 인스턴스를 시스템 메모리에 유지하기 때문에 +{@link android.app.Activity#onStop()} 및 {@link android.app.Activity#onRestart()} 또는 {@link +android.app.Activity#onStart()} 메서드 조차 구현할 필요가 없을 수도 있습니다. 비교적 간단한 액티비티의 경우 대부분, +액티비티가 별 문제 없이 정지되고 재시작됩니다. 따라서 {@link +android.app.Activity#onPause()}를 사용하여 진행 중인 작업을 일시정지하고 시스템 리소스와의 연결을 끊기만 하면 됩니다.</p> + +<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" /> +<p class="img-caption"><strong>그림 1.</strong> 사용자가 액티비티를 떠나면, 시스템은 +{@link android.app.Activity#onStop onStop()}을 호출하여 액티비티를 정지시킵니다(1). 액티비티가 정지된 상태에서 +사용자가 돌아올 경우, 시스템은 {@link android.app.Activity#onRestart onRestart()}(2) +를 호출하고, 곧바로 {@link android.app.Activity#onStart onStart()}(3) 및 {@link +android.app.Activity#onResume()}(4)을 호출합니다. 어떤 시나리오로 인해 액티비티가 +정지되든 간에, 시스템은 항상 {@link +android.app.Activity#onStop onStop()}을 호출하기 전에 {@link android.app.Activity#onPause onPause()}를 호출합니다.</p> + + + +<h2 id="Stop">액티비티 정지하기</h2> + +<p>{@link android.app.Activity#onStop()} 메서드에 대한 호출을 수신한 액티비티는 더 +이상 보이지 않게 되고, 사용자가 +사용하지 않는 동안 필요하지 않은 거의 모든 리소스를 해제해야 합니다. 액티비티가 정지되고 나면, 시스템이 시스템 메모리를 +회수해야 하는 경우 해당 인스턴스를 소멸할 수도 있습니다. 심한 경우, 시스템이 액티비티의 최종 +{@link android.app.Activity#onDestroy()} 콜백을 호출하지 않고 앱 프로세스만 단순하게 중단시킬 수도 있습니다. 따라서 {@link android.app.Activity#onStop()}을 사용하여 +메모리 누수를 야기시킬 수 있는 리소스를 해제하는 것이 중요합니다.</p> + +<p>{@link android.app.Activity#onStop()} 전에 {@link android.app.Activity#onPause onPause()} +메서드가 호출되기는 하지만, 데이터베이스에 정보를 쓰는 +작업과 같이 규모가 크고 CPU를 많이 사용하는 종료 작업을 수행하는 경우 +{@link android.app.Activity#onStop onStop()}을 사용해야 합니다.</p> + +<p>다음은 영구적인 저장소에 노트 원고의 내용을 +저장하는 {@link android.app.Activity#onStop onStop()}을 구현하는 예제입니다.</p> + +<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a +separate thread but that's too complicated to show here. --> +<pre> +@Override +protected void onStop() { + super.onStop(); // Always call the superclass method first + + // Save the note's current draft, because the activity is stopping + // and we want to be sure the current note progress isn't lost. + ContentValues values = new ContentValues(); + values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); + values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); + + getContentResolver().update( + mUri, // The URI for the note to update. + values, // The map of column names and new values to apply to them. + null, // No SELECT criteria are used. + null // No WHERE columns are used. + ); +} +</pre> + +<p>액티비티가 정지되면, {@link android.app.Activity} 개체는 메모리에 계속 유지되며, +액티비티가 재개되면 다시 호출됩니다. 최상위 상태가 재개됨 상태인 콜백 메서드 중에 +생성된 구성요소는 다시 초기화할 필요가 없습니다. 또한 시스템은 레이아웃에 있는 각 {@link android.view.View}의 현재 상태도 +기록합니다. 따라서 사용자가 {@link android.widget.EditText} 위젯에 텍스트를 +입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 +필요가 없습니다.</p> + +<p class="note"><strong>참고:</strong> 시스템이 정지된 상태의 액티비티를 소멸시키는 경우에도, +{@link android.os.Bundle}(키-값 쌍 Blob) 내에 {@link +android.widget.EditText}와 같은 {@link android.view.View} 개체의 상태를 유지하고, 사용자가 +액티비티의 같은 인스턴스로 돌아오면 이를 복원합니다. 액티비티가 소멸되고 재생성될 경우, {@link android.os.Bundle}을 사용하여 +다른 상태 데이터를 저장하는 방법에 대해서는 <a href="recreating.html">다음 과정</a>에서 자세히 설명합니다.</p> + + + +<h2 id="Start">액티비티 시작/재시작하기</h2> + +<p>액티비티가 정지된 상태에서 전면으로 되돌아올 때 +{@link android.app.Activity#onRestart()}에 대한 호출을 수신합니다. 시스템은 {@link +android.app.Activity#onStart()} 메서드도 호출합니다. 이 동작은 재시작되든, 아니면 처음 생성되든지에 상관없이 +액티비티가 보이게 될 때마다 발생합니다. 하지만 {@link +android.app.Activity#onRestart()} 메서드는 액티비티가 +정지된 상태에서 재개되는 경우에만 호출됩니다. 따라서 +액티비티가 소멸된 것이 아니라 이전에 정지된 경우에 한하여 필요할 수 있는 특수 복원 작업을 수행하는 데 이 메서드를 사용할 수 있습니다.</p> + +<p>액티비티의 상태 +복원 작업에 앱이 {@link android.app.Activity#onRestart()}를 사용해야 하는 경우는 드물기 때문에 +일반 앱에 적용되는 이 메서드에 대한 가이드라인은 없습니다. 하지만 {@link android.app.Activity#onStop()} +메서드는 모든 액티비티 리소스를 기본적으로 정리해야 하기 때문에, 액티비티가 재개되면 +다시 인스턴스화해야 합니다. 하지만 액티비티가 처음 +생성되는 경우(액티비티의 기존 인스턴스가 없을 경우)에도 인스턴스화해야 합니다. 따라서 +일반적으로 {@link android.app.Activity#onStart()} 콜백 메서드를 {@link android.app.Activity#onStop()} 메서드에 대한 상대 +메서드로 사용해야 합니다. 그 이유는 시스템이 액티비티를 생성할 때와 +액티비티를 정지된 상태에서 재시작할 때 모두 {@link +android.app.Activity#onStart()}를 호출하기 때문입니다.</p> + +<p>예를 들어 사용자가 장시간 앱을 떠났다가 다시 앱으로 +돌아올 수 있기 때문에, {@link android.app.Activity#onStart()} 메서드는 +필요한 시스템 기능이 활성화되었는지 확인하기 위한 좋은 위치입니다.</p> + +<pre> +@Override +protected void onStart() { + super.onStart(); // Always call the superclass method first + + // The activity is either being restarted or started for the first time + // so this is where we should make sure that GPS is enabled + LocationManager locationManager = + (LocationManager) getSystemService(Context.LOCATION_SERVICE); + boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + + if (!gpsEnabled) { + // Create a dialog here that requests the user to enable GPS, and use an intent + // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action + // to take the user to the Settings screen to enable GPS when they click "OK" + } +} + +@Override +protected void onRestart() { + super.onRestart(); // Always call the superclass method first + + // Activity being restarted from stopped state +} +</pre> + + + + +<p>시스템이 액티비티를 소멸시킬 경우, {@link android.app.Activity}에 대해 {@link android.app.Activity#onDestroy()} +메서드를 호출합니다. {@link +android.app.Activity#onDestroy()}에 대한 호출을 수신하기 전에 {@link android.app.Activity#onStop()}을 사용하여 대부분의 +리소스를 해제했을 것이기 때문에 대부분의 앱의 경우 수행할 작업이 거의 없습니다. 이 메서드는 메모리 누수를 야기할 수 있는 리소스를 정리할 수 있는 +마지막 기회입니다. 이에 따라 +추가 스레드를 소멸시키고 메서드 추적과 같이 시간이 걸리는 기타 작업도 +정지되도록 할 수 있습니다.</p> + |