1page.title=액티비티 시작하기 2page.tags=activity lifecycle 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9 10<div id="tb-wrapper"> 11 <div id="tb"> 12 13 <h2>이 과정에서 다루는 내용</h2> 14<ol> 15 <li><a href="#lifecycle-states">수명 주기 콜백 이해하기</a></li> 16 <li><a href="#launching-activity">앱 시작 관리자 액티비티 지정하기</a></li> 17 <li><a href="#Create">새로운 인스턴스 생성하기</a></li> 18 <li><a href="#Destroy">액티비티 소멸하기</a></li> 19</ol> 20 21 <h2>필독 항목</h2> 22 <ul> 23 <li><a href="{@docRoot}guide/components/activities.html">액티비티</a></li> 24 </ul> 25 26<h2>실습하기</h2> 27 28<div class="download-box"> 29 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">데모 다운로드</a> 30 <p class="filename">ActivityLifecycle.zip</p> 31</div> 32 33 </div> 34</div> 35 36<p>{@code main()} 메서드로 앱이 실행되는 다른 프로그래밍 패러다임과는 달리, 37Android 시스템은 {@link android.app.Activity} 인스턴스 수명 주기의 특정 단계에 부합하는 특정 38콜백 메서드를 호출하여 해당 인스턴스 내 코드를 39실행합니다. 액티비티를 시작하는 순차적인 콜백 메서드가 있으며, 액티비티를 소멸시키는 40순차적인 콜백 메서드가 있습니다.</p> 41 42<p>이 과정에서는 가장 중요한 수명 주기 메서드에 대해 간략히 설명하며, 액티비티의 새 인스턴스를 생성하는 첫 번째 수명 주기 콜백을 43처리하는 방법을 보여줍니다.</p> 44 45 46 47<h2 id="lifecycle-states">수명 주기 콜백 이해하기</h2> 48 49<p>액티비티 수명 동안, 시스템은 계단식 피라미드와 비슷하게 수명 주기 메서드의 핵심 세트를 50순차적으로 호출합니다. 즉, 51액티비티 수명 주기의 각 단계는 피라미드의 각 계단과 같습니다. 시스템이 새 액티비티 인스턴스를 생성하면, 52각각의 콜백 메서드는 액티비티 상태를 한 단계 상향 이동합니다. 피라미드의 최상층은 53액티비티가 전면에서 실행 중이며 사용자가 이러한 액티비티와 상호 작용할 수 있는 단계를 뜻합니다.</p> 54 55<p>사용자가 액티비티를 나가면, 시스템은 액티비티를 해체하기 위해 액티비티 56상태를 피라미드에서 하향 이동하는 다른 메서드를 호출합니다. 경우에 따라, 액티비티가 57피라미드에서 완전히 하향 이동되지 않고 기다립니다(예: 사용자가 다른 앱으로 전환한 경우). 이런 경우, 58액티비티는 다시 피라미드 최상층으로 상향 이동될 수 있으며(사용자가 액티비티로 돌아갈 경우), 사용자는 종료한 지점에서 59작업을 재개할 수 있습니다.</p> 60 61 62<img src="{@docRoot}images/training/basics/basic-lifecycle.png" /> 63<p class="img-caption"><strong>그림 1.</strong> 액티비티 64수명 주기를 계단식 피라미드로 간략하게 표현한 그림. 이 그림에서는 최상층에 있는 65재개됨(Resumed) 상태를 향하여 액티비티를 한 단계 상향 이동하는 데 사용되는 각 콜백마다 하위 단계로 66액티비티를 하향 이동하는 콜백 메서드가 있음을 보여줍니다. 액티비티는 67일시정지됨(Paused) 및 정지됨(Stopped) 상태에서도 재개 상태로 돌아갈 수 있습니다.</p> 68 69 70<p>액티비티의 복잡한 정도에 따라, 모든 71수명 주기 메서드를 구현할 필요가 없는 경우도 있습니다. 하지만 각각의 수명 주기 메서드를 이해하고, 사용자가 예상한 대로 72앱이 동작하도록 필요한 수명 주기 메서드를 구현하는 것이 중요합니다. 액티비티 수명 주기 메서드를 올바르게 구현하면, 다음을 포함하여 여러 가지 방법으로 앱이 제대로 동작하도록 73보장할 수 있습니다.</p> 74<ul> 75 <li>사용자가 앱을 사용하는 76도중에 전화가 걸려오거나 다른 앱으로 전환할 때 충돌하지 않도록 합니다.</li> 77 <li>사용자가 앱을 활발하게 사용하지 않는 경우, 소중한 시스템 리소스를 소비하지 78않도록 합니다.</li> 79 <li>사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태를 80손실하지 않도록 합니다.</li> 81 <li>화면이 가로 방향과 세로 방향 간에 회전할 경우, 충돌하거나 사용자의 82진행 상태를 손실하지 않도록 합니다.</li> 83</ul> 84 85<!-- 86<p class="table-caption"><strong>Table 1.</strong> Activity lifecycle state pairs and callback 87methods.</p> 88<table> 89 <tr> 90 <th scope="col">Lifecycle State</th> 91 <th scope="col">Startup Method</th> 92 <th scope="col">Teardown Method</th> 93 </tr> 94 <tr> 95 <td>Created / Destroyed</td> 96 <td>{@link android.app.Activity#onCreate onCreate()}</td> 97 <td>{@link android.app.Activity#onDestroy()}</td> 98 </tr> 99 <tr> 100 <td>Started / Stopped</td> 101 <td>{@link android.app.Activity#onStart()}</td> 102 <td>{@link android.app.Activity#onStop()}</td> 103 </tr> 104 <tr> 105 <td>Resumed / Resumed</td> 106 <td>{@link android.app.Activity#onResume()}</td> 107 <td>{@link android.app.Activity#onPause()}</td> 108 </tr> 109</table> 110--> 111 112<p>다음 과정에서 확인할 수 있듯이, 액티비티가 그림 1에 나와 있는 상태 간을 113전환하는 여러 가지 상황이 있습니다. 하지만, 이들 상태 114중 세 가지만 유일하게 정적일 수 있습니다. 즉, 액티비티는 115이 세 가지 상태에 한하여 그중 하나에서 장시간 동안 존재할 수 있습니다.</p> 116<dl> 117 <dt>재개됨(Resumed)</dt> 118 <dd>이 상태에서는 액티비티가 전면에 있으며 사용자가 액티비티와 상호 작용할 수 119있습니다(경우에 따라 "실행 중" 상태라고도 함).</dd> 120 <dt>일시정지됨(Paused)</dt> 121 <dd>이 상태에서는 액티비티가 다른 액티비티로 인해 부분적으로 가려져 있습니다. 이런 경우, 전면에 있는 122다른 액티비티는 반투명이거나 전체 화면을 차지하지 않습니다. 일시정지된 123액티비티는 사용자 입력을 받지 않으며, 어떠한 코드도 실행할 수 없습니다. 124 <dt>정지됨(Stopped)</dt> 125 <dd>이 상태에서는 액티비티가 완전히 가려져서 사용자에게 보이지 않습니다. 이 상태는 액티비티가 백그라운드에 있는 것으로 126간주됩니다. 정지되어 있는 동안 액티비티 인스턴스 및 멤버 변수와 같은 모든 상태 127정보가 유지되지만, 어떠한 코드도 실행할 수 없습니다.</dd> 128</dl> 129 130<p>이외의 상태(생성됨(Created) 및 시작됨(Started))는 일시적이며, 시스템은 다음 수명 주기 콜백 메서드를 호출하여 131다음 상태로 신속하게 전환합니다. 즉, 시스템은 132{@link android.app.Activity#onCreate onCreate()}를 호출한 후 바로 {@link 133android.app.Activity#onStart()}를 호출하고, 또 그 즉시 {@link 134android.app.Activity#onResume()}을 호출합니다.</p> 135 136<p>이것으로 기본적인 액티비티 수명 주기에 대한 설명을 마칩니다. 이제, 137구체적인 수명 주기 동작에 대해 알아보도록 하겠습니다.</p> 138 139 140 141<h2 id="launching-activity">앱 시작 관리자 액티비티 지정하기</h2> 142 143<p>사용자가 홈 화면에서 앱 아이콘을 선택하면, 시스템이 앱에서 "시작 관리자"(또는 "메인") 액티비티로 선언한 {@link android.app.Activity}에 대한 {@link 144android.app.Activity#onCreate onCreate()} 메서드를 145호출합니다. 이 액티비티는 앱의 사용자 인터페이스에 대한 146주 진입점 역할을 합니다.</p> 147 148<p>Android 매니페스트 파일인 <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">{@code AndroidManifest.xml}</a>에 메인 액티비티로 사용할 액티비티를 정의할 수 있습니다. 이 파일은 149프로젝트 디렉터리의 루트에 있습니다.</p> 150 151<p>앱의 메인 액티비티는 {@link 152android.content.Intent#ACTION_MAIN MAIN} 작업 및{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} 카테고리를 포함하는 <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 153<intent-filter>}</a>와 함께 154매니페스트 파일에 선언되어야 합니다. 예를 들면 다음과 같습니다.</p> 155 156<pre> 157<activity android:name=".MainActivity" android:label="@string/app_name"> 158 <intent-filter> 159 <action android:name="android.intent.action.MAIN" /> 160 <category android:name="android.intent.category.LAUNCHER" /> 161 </intent-filter> 162</activity> 163</pre> 164 165<p class="note"><strong>참고:</strong> Android SDK 166Tools를 사용하여 새 Android 프로젝트를 생성하는 경우, 매니페스트에서 이 필터와 함께 167선언된 {@link android.app.Activity} 클래스가 기본 프로젝트 파일에 포함됩니다.</p> 168 169<p>{@link android.content.Intent#ACTION_MAIN MAIN} 작업 또는 170{@link android.content.Intent#CATEGORY_LAUNCHER LAUNCHER} 카테고리가 171액티비티 중 하나에 대해 선언되어 있지 않을 경우, 홈 화면의 앱 목록에 앱 아이콘이 표시되지 않습니다.</p> 172 173 174 175<h2 id="Create">새로운 인스턴스 생성하기</h2> 176 177<p>대부분의 앱은 사용자가 다양한 작업을 수행할 수 있도록 여러 액티비티를 포함하고 있습니다. 178액티비티가 사용자가 앱 아이콘을 클릭할 때 생성되는 메인 액티비티든, 사용자 작업에 179대한 응답으로 앱이 시작하는 다른 액티비티든 간에, 180시스템은 {@link 181android.app.Activity#onCreate onCreate()} 메서드를 호출하여 매번 {@link android.app.Activity}의 새 인스턴스를 생성합니다.</p> 182 183<p>액티비티의 전체 수명 주기 동안 한 번만 발생하는 기본 184애플리케이션 시작 논리를 수행하도록 {@link android.app.Activity#onCreate onCreate()} 메서드를 구현해야 합니다. 예를 185들어 {@link android.app.Activity#onCreate onCreate()}의 구현은 186사용자 인터페이스를 정의해야 하며, 몇몇 클래스 범위의 변수를 인스턴스화해야 할 수 있습니다.</p> 187 188<p>예를 들어 다음 {@link android.app.Activity#onCreate onCreate()} 189메서드에 대한 예제는 190사용자 인터페이스 선언(XML 레이아웃 파일에 정의), 멤버 변수 정의, 191몇몇 UI 구성과 같은 액티비티에 대한 몇 가지 기본 설정을 수행하는 코드를 보여줍니다.</p> 192 193<pre> 194TextView mTextView; // Member variable for text view in the layout 195 196@Override 197public void onCreate(Bundle savedInstanceState) { 198 super.onCreate(savedInstanceState); 199 200 // Set the user interface layout for this Activity 201 // The layout file is defined in the project res/layout/main_activity.xml file 202 setContentView(R.layout.main_activity); 203 204 // Initialize member TextView so we can manipulate it later 205 mTextView = (TextView) findViewById(R.id.text_message); 206 207 // Make sure we're running on Honeycomb or higher to use ActionBar APIs 208 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 209 // For the main activity, make sure the app icon in the action bar 210 // does not behave as a button 211 ActionBar actionBar = getActionBar(); 212 actionBar.setHomeButtonEnabled(false); 213 } 214} 215</pre> 216 217<p class="caution"><strong>주의:</strong> {@link android.os.Build.VERSION#SDK_INT}를 사용하여 218이전 시스템이 새 API를 실행하지 못하도록 방지하는 방법은 Android 2.0(API 레벨 2195) 이상에서만 가능합니다. 이전 버전에서는 런타임 예외가 발생합니다.</p> 220 221<p>{@link android.app.Activity#onCreate onCreate()}가 실행을 마치면 시스템은 222{@link android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()} 메서드를 223연달아 호출합니다. 액티비티가 생성됨(Created) 또는 시작됨(Started) 상태에서 머무르는 경우는 없습니다. 엄밀히 말하면 224{@link android.app.Activity#onStart()}가 호출되면 액티비티가 사용자에게 보이지만, 225{@link android.app.Activity#onResume()}이 바로 뒤따르고, 어떠한 상황(예: 전화가 오거나, 226사용자가 다른 액티비티로 전환하거나, 기기 화면이 꺼진 경우)이 발생하기 전까지는 액티비티가 227재개됨(Resumed) 상태로 유지됩니다.</p> 228 229<p>앞으로 진행되는 과정에서는 다른 시작 메서드인 {@link 230android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()}이 일시정지됨(Paused) 또는 정지됨(Stopped) 상태에서 231액티비티를 재개하기 위해 사용된 경우 액티비티의 수명 주기 동안 어떤 식으로 유용한지에 대해 설명합니다.</p> 232 233<p class="note"><strong>참고:</strong> {@link android.app.Activity#onCreate onCreate()} 234메서드는 <code>savedInstanceState</code>라고 하는 매개변수를 포함합니다. 이 매개변수는 <a href="recreating.html">액티비티 재생성하기</a>에 대한 235마지막 과정에서 설명합니다.</p> 236 237 238<img src="{@docRoot}images/training/basics/basic-lifecycle-create.png" /> 239<p class="img-caption"><strong>그림 2.</strong> 액티비티의 새 인스턴스를 생성할 때 240시스템이 순차적으로 호출하는 {@link android.app.Activity#onCreate onCreate()}, {@link android.app.Activity#onStart()} 및 {@link android.app.Activity#onResume()}의 241세 가지 메인 콜백을 강조하여 보여주는 액티비티의 수명 주기 구조에 242대한 또 다른 그림. 이러한 순차적인 243콜백이 완료되면, 액티비티는 재개됨(Resumed) 상태가 됩니다. 이 상태에서는 사용자가 다른 244액티비티로 전환하기 전까지 사용자가 액티비티와 상호 작용할 수 있습니다.</p> 245 246 247 248 249 250 251 252<h2 id="Destroy">액티비티 소멸하기</h2> 253 254<p>액티비티의 첫 번째 수명 주기 콜백은 {@link android.app.Activity#onCreate 255onCreate()}이고, 마지막 콜백은 {@link android.app.Activity#onDestroy}입니다. 시스템은 256시스템 메모리에서 액티비티 인스턴스가 완전히 제거된다는 내용의 마지막 257신호로 액티비티에서 이 메서드를 호출합니다.</p> 258 259<p>대부분의 앱은 이 메서드를 구현할 필요가 없습니다. 왜냐하면 액티비티와 260함께 로컬 클래스 참조가 소멸되고, 액티비티가 {@link 261android.app.Activity#onPause} 및 {@link android.app.Activity#onStop} 중에 대부분 정리 작업을 수행하기 때문입니다. 하지만 262액티비티가 {@link 263android.app.Activity#onCreate onCreate()} 중에 생성한 백그라운드 스레드 또는 제대로 닫지 않으면 메모리 누수를 264야기할 수 있는 다른 장시간 실행되는 리소스를 포함하는 경우, {@link 265android.app.Activity#onDestroy} 중에 액티비티를 중단시켜야 합니다.</p> 266 267<pre> 268@Override 269public void onDestroy() { 270 super.onDestroy(); // Always call the superclass 271 272 // Stop method tracing that the activity started during onCreate() 273 android.os.Debug.stopMethodTracing(); 274} 275</pre> 276 277<p class="note"><strong>참고:</strong> 시스템은 한 가지 경우, 278즉 {@link android.app.Activity#onCreate onCreate()} 메서드에서 {@link 279android.app.Activity#finish()}를 호출하는 경우를 제외하고는, {@link android.app.Activity#onPause} 및 {@link 280android.app.Activity#onStop}을 먼저 호출한 후에 {@link android.app.Activity#onDestroy}를 281호출합니다. 경우에 따라(예: 액티비티가 다른 액티비티를 282실행하기 위한 임시 의사 결정자 역할을 할 경우), {@link 283android.app.Activity#onCreate onCreate()} 내에서 {@link android.app.Activity#finish()}를 호출하여 액티비티를 소멸시킬 수도 있습니다. 이 경우, 시스템이 284다른 수명 주기 메서드를 호출하지 않고 즉시 285{@link android.app.Activity#onDestroy}를 호출합니다.</p> 286