1page.title=액티비티 정지 및 재시작하기 2page.tags=activity lifecycle 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9<div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>이 과정에서 다루는 내용</h2> 13 <ol> 14 <li><a href="#Stop">액티비티 정지하기</a></li> 15 <li><a href="#Start">액티비티 시작/재시작하기</a></li> 16 </ol> 17 18 <h2>필독 항목</h2> 19 <ul> 20 <li><a href="{@docRoot}guide/components/activities.html">액티비티</a> 21 </li> 22 </ul> 23 24<h2>실습하기</h2> 25 26<div class="download-box"> 27 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> 28 <p class="filename">ActivityLifecycle.zip</p> 29</div> 30 31 </div> 32</div> 33 34<p>액티비티 수명 주기에서 액티비티를 제대로 정지하고 재시작하는 것은 중요한 프로세스입니다. 35그래야만 사용자가 앱이 항상 작동 상태를 유지하고 진행 상태를 손실하지 않는다고 인식하도록 할 수 있습니다. 36다음과 같이 액티비티가 정지되었다가 재시작되는 몇 가지 중요한 시나리오가 있습니다.</p> 37 38<ul> 39 <li>사용자가 최근 앱 창을 열고 다른 액티비티로 전환하면 현재 전면에 있는 앱의 40액티비티가 정지됩니다. 사용자가 홈 화면 시작 관리자 아이콘 또는 최근 앱 창에서 41앱으로 돌아오면 액티비티가 재시작됩니다.</li> 42 <li>사용자가 앱에서 새 액티비티를 시작하는 작업을 수행합니다. 두 번째 액티비티가 43생성되면 현재 액티비티가 정지됩니다. 사용자가 <em>뒤로</em> 44버튼을 누르면 첫 번째 액티비티가 재시작됩니다.</li> 45 <li>사용자가 앱을 사용하는 도중에 전화가 걸려옵니다.</li> 46</ul> 47 48<p>{@link android.app.Activity} 클래스는 두 가지 수명 주기 메서드인 {@link 49android.app.Activity#onStop()} 및 {@link android.app.Activity#onRestart()}를 제공합니다. 이 메서드를 사용하면 액티비티의 정지 및 재시작 처리 방법을 50명확하게 지정할 수 있습니다. 부분적인 UI 차단을 식별하는 51일시정지됨 상태와 달리, 정지됨 상태는 UI가 더 이상 보이지 않으며, 52사용자의 포커스가 별도의 액티비티 또는 완전히 별도의 앱에 있음을 보장합니다.</p> 53 54<p class="note"><strong>참고:</strong> {@link android.app.Activity} 55인스턴스가 정지되면 시스템이 이 인스턴스를 시스템 메모리에 유지하기 때문에 56{@link android.app.Activity#onStop()} 및 {@link android.app.Activity#onRestart()} 또는 {@link 57android.app.Activity#onStart()} 메서드 조차 구현할 필요가 없을 수도 있습니다. 비교적 간단한 액티비티의 경우 대부분, 58액티비티가 별 문제 없이 정지되고 재시작됩니다. 따라서 {@link 59android.app.Activity#onPause()}를 사용하여 진행 중인 작업을 일시정지하고 시스템 리소스와의 연결을 끊기만 하면 됩니다.</p> 60 61<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" /> 62<p class="img-caption"><strong>그림 1.</strong> 사용자가 액티비티를 떠나면, 시스템은 63{@link android.app.Activity#onStop onStop()}을 호출하여 액티비티를 정지시킵니다(1). 액티비티가 정지된 상태에서 64사용자가 돌아올 경우, 시스템은 {@link android.app.Activity#onRestart onRestart()}(2) 65를 호출하고, 곧바로 {@link android.app.Activity#onStart onStart()}(3) 및 {@link 66android.app.Activity#onResume()}(4)을 호출합니다. 어떤 시나리오로 인해 액티비티가 67정지되든 간에, 시스템은 항상 {@link 68android.app.Activity#onStop onStop()}을 호출하기 전에 {@link android.app.Activity#onPause onPause()}를 호출합니다.</p> 69 70 71 72<h2 id="Stop">액티비티 정지하기</h2> 73 74<p>{@link android.app.Activity#onStop()} 메서드에 대한 호출을 수신한 액티비티는 더 75이상 보이지 않게 되고, 사용자가 76사용하지 않는 동안 필요하지 않은 거의 모든 리소스를 해제해야 합니다. 액티비티가 정지되고 나면, 시스템이 시스템 메모리를 77회수해야 하는 경우 해당 인스턴스를 소멸할 수도 있습니다. 심한 경우, 시스템이 액티비티의 최종 78{@link android.app.Activity#onDestroy()} 콜백을 호출하지 않고 앱 프로세스만 단순하게 중단시킬 수도 있습니다. 따라서 {@link android.app.Activity#onStop()}을 사용하여 79메모리 누수를 야기시킬 수 있는 리소스를 해제하는 것이 중요합니다.</p> 80 81<p>{@link android.app.Activity#onStop()} 전에 {@link android.app.Activity#onPause onPause()} 82메서드가 호출되기는 하지만, 데이터베이스에 정보를 쓰는 83작업과 같이 규모가 크고 CPU를 많이 사용하는 종료 작업을 수행하는 경우 84{@link android.app.Activity#onStop onStop()}을 사용해야 합니다.</p> 85 86<p>다음은 영구적인 저장소에 노트 원고의 내용을 87저장하는 {@link android.app.Activity#onStop onStop()}을 구현하는 예제입니다.</p> 88 89<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a 90separate thread but that's too complicated to show here. --> 91<pre> 92@Override 93protected void onStop() { 94 super.onStop(); // Always call the superclass method first 95 96 // Save the note's current draft, because the activity is stopping 97 // and we want to be sure the current note progress isn't lost. 98 ContentValues values = new ContentValues(); 99 values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); 100 values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); 101 102 getContentResolver().update( 103 mUri, // The URI for the note to update. 104 values, // The map of column names and new values to apply to them. 105 null, // No SELECT criteria are used. 106 null // No WHERE columns are used. 107 ); 108} 109</pre> 110 111<p>액티비티가 정지되면, {@link android.app.Activity} 개체는 메모리에 계속 유지되며, 112액티비티가 재개되면 다시 호출됩니다. 최상위 상태가 재개됨 상태인 콜백 메서드 중에 113생성된 구성요소는 다시 초기화할 필요가 없습니다. 또한 시스템은 레이아웃에 있는 각 {@link android.view.View}의 현재 상태도 114기록합니다. 따라서 사용자가 {@link android.widget.EditText} 위젯에 텍스트를 115입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 116필요가 없습니다.</p> 117 118<p class="note"><strong>참고:</strong> 시스템이 정지된 상태의 액티비티를 소멸시키는 경우에도, 119{@link android.os.Bundle}(키-값 쌍 Blob) 내에 {@link 120android.widget.EditText}와 같은 {@link android.view.View} 개체의 상태를 유지하고, 사용자가 121액티비티의 같은 인스턴스로 돌아오면 이를 복원합니다. 액티비티가 소멸되고 재생성될 경우, {@link android.os.Bundle}을 사용하여 122다른 상태 데이터를 저장하는 방법에 대해서는 <a href="recreating.html">다음 과정</a>에서 자세히 설명합니다.</p> 123 124 125 126<h2 id="Start">액티비티 시작/재시작하기</h2> 127 128<p>액티비티가 정지된 상태에서 전면으로 되돌아올 때 129{@link android.app.Activity#onRestart()}에 대한 호출을 수신합니다. 시스템은 {@link 130android.app.Activity#onStart()} 메서드도 호출합니다. 이 동작은 재시작되든, 아니면 처음 생성되든지에 상관없이 131액티비티가 보이게 될 때마다 발생합니다. 하지만 {@link 132android.app.Activity#onRestart()} 메서드는 액티비티가 133정지된 상태에서 재개되는 경우에만 호출됩니다. 따라서 134액티비티가 소멸된 것이 아니라 이전에 정지된 경우에 한하여 필요할 수 있는 특수 복원 작업을 수행하는 데 이 메서드를 사용할 수 있습니다.</p> 135 136<p>액티비티의 상태 137복원 작업에 앱이 {@link android.app.Activity#onRestart()}를 사용해야 하는 경우는 드물기 때문에 138일반 앱에 적용되는 이 메서드에 대한 가이드라인은 없습니다. 하지만 {@link android.app.Activity#onStop()} 139메서드는 모든 액티비티 리소스를 기본적으로 정리해야 하기 때문에, 액티비티가 재개되면 140다시 인스턴스화해야 합니다. 하지만 액티비티가 처음 141생성되는 경우(액티비티의 기존 인스턴스가 없을 경우)에도 인스턴스화해야 합니다. 따라서 142일반적으로 {@link android.app.Activity#onStart()} 콜백 메서드를 {@link android.app.Activity#onStop()} 메서드에 대한 상대 143메서드로 사용해야 합니다. 그 이유는 시스템이 액티비티를 생성할 때와 144액티비티를 정지된 상태에서 재시작할 때 모두 {@link 145android.app.Activity#onStart()}를 호출하기 때문입니다.</p> 146 147<p>예를 들어 사용자가 장시간 앱을 떠났다가 다시 앱으로 148돌아올 수 있기 때문에, {@link android.app.Activity#onStart()} 메서드는 149필요한 시스템 기능이 활성화되었는지 확인하기 위한 좋은 위치입니다.</p> 150 151<pre> 152@Override 153protected void onStart() { 154 super.onStart(); // Always call the superclass method first 155 156 // The activity is either being restarted or started for the first time 157 // so this is where we should make sure that GPS is enabled 158 LocationManager locationManager = 159 (LocationManager) getSystemService(Context.LOCATION_SERVICE); 160 boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 161 162 if (!gpsEnabled) { 163 // Create a dialog here that requests the user to enable GPS, and use an intent 164 // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action 165 // to take the user to the Settings screen to enable GPS when they click "OK" 166 } 167} 168 169@Override 170protected void onRestart() { 171 super.onRestart(); // Always call the superclass method first 172 173 // Activity being restarted from stopped state 174} 175</pre> 176 177 178 179 180<p>시스템이 액티비티를 소멸시킬 경우, {@link android.app.Activity}에 대해 {@link android.app.Activity#onDestroy()} 181메서드를 호출합니다. {@link 182android.app.Activity#onDestroy()}에 대한 호출을 수신하기 전에 {@link android.app.Activity#onStop()}을 사용하여 대부분의 183리소스를 해제했을 것이기 때문에 대부분의 앱의 경우 수행할 작업이 거의 없습니다. 이 메서드는 메모리 누수를 야기할 수 있는 리소스를 정리할 수 있는 184마지막 기회입니다. 이에 따라 185추가 스레드를 소멸시키고 메서드 추적과 같이 시간이 걸리는 기타 작업도 186정지되도록 할 수 있습니다.</p> 187 188