diff options
Diffstat (limited to 'docs/html-intl/intl/ko/training/basics/activity-lifecycle/stopping.jd')
-rw-r--r-- | docs/html-intl/intl/ko/training/basics/activity-lifecycle/stopping.jd | 187 |
1 files changed, 187 insertions, 0 deletions
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> + |