본문 바로가기

안드로이드/고급

[PAAD] 3장 리소스 런타임구성, 애플리케이션확장, 액티비티생명주기


1. 런타임 구성 변경
- 안드로이드는 언어, 위치, 하드웨어 에 대한 변겨잉 실행 시점에 이뤄질 경우
  각 애플리케이션을 종료했다가 재시작 시킨 뒤 리소스 값들을 다시 읽어 들임으로써 변경된 내용을 반영
(기기회전, 키보드)

android:configChanges
-orientation 화면이 세로 모드나 가로모드로 전환됐다
-keyvoardHidden 키보드가 나타났거나 숨겨졌다
-[p104]

<activity android:name=".TodoList"
          android:label="@string/app_name"
          android:theme="@style/TodoTheme"
          android:configChanges="orientation|keyboardHidden"/>
- 속성을 추가하면, 지정된 구선 변경을 위해서느느 재시작되지 않고, 액티비티의 onConfigurationChanged 메소드 호출

@Override
public void onConfigurationChanged(Configuration _newConfig) {
  super.onConfigurationChanged(_newConfig); 

  [ ... Update any UI based on resource values ... ]

  if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    [ ... 달라진 방향에 반응 ... ]
  }

  if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
    [ ... React to changed keyboard visibility ... ]
  }
}

- 없다면 애플리케이션 재시작


2. 애플리케이션 클래스 확장하기
- 애플리케이션 상태 유지
- 애플리케이션 컴포넌트들 간에 객체를 전송할 수 있다
- 여러 애플리케이션 컴포넌트들이 사용하는 리소스들을 관리하고 유지할 수 있다.

// ** Listing 3-7: Skeleton application class

// Appliction Class Extenstion

import android.app.Application;
import android.content.res.Configuration;

public class MyApplication extends Application {
 
  private static MyApplication singleton;       
  
  // Returns the application instance
  public static MyApplication getInstance() {
    return singleton;
  }
   
  @Override
  public final void onCreate() {
    super.onCreate();   
    singleton = this;   
  }
}

// Manifest entry
<application android:icon="@drawable/icon"
             android:name="MyApplication">
  [... Manifest nodes ...]
</application>

// Use in code
MyObject value = MyApplication.getInstance().getGlobalStateValue();
MyApplication.getInstance().setGlobalStateValue(myObjectValue);

- 약하게 결합된 애플리케이션 컴포넌트들 간에 객체를 전송하거나 애플리 케이션 상태 혹은 공유 리소스를 유지하는데 효과적

3. 애플리케이션 수명 주기 이벤트 재정의 하기
- 각 상황에따른 대처가능


// ** Listing 3-8: Overriding the application life cycle handlers
public class MyApplication extends Application {
 
  private static MyApplication singleton;       
  
  // Returns the application instance
  public static MyApplication getInstance() {
    return singleton;
  }
   
  @Override
  public final void onCreate() {
    super.onCreate();   
    singleton = this;   
  }

  @Override
  public final void onTerminate() {
    super.onTerminate();      
  }
 
  @Override
  public final void onLowMemory() {
    super.onLowMemory();   
  }
 
  @Override
  public final void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  }
}

4. 액티비티 생명주기


// ** Listing 3-12: Activity state event handlers
package com.paad.myapplication;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {

  // Called at the start of the full lifetime.
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Initialize activity.
  }
 
  // Called after onStart has finished, use to restore UI state
  @Override
  public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
  }

  // Called before subsequent visible lifetimes
  // for an activity process.
  @Override
  public void onRestart(){
    super.onRestart();
    // Load changes knowing that the activity has already
    // been visible within this process.
  }

  // Called at the start of the visible lifetime.
  @Override
  public void onStart(){
    super.onStart();
    // Apply any required UI change now that the Activity is visible.
  }

  // Called at the start of the active lifetime.
  @Override
  public void onResume(){
    super.onResume();
    // Resume any paused UI updates, threads, or processes required
    // by the activity but suspended when it was inactive.
  }

  // Called to save UI state changes at the
  // end of the active lifecycle.
  @Override
  public void onSaveInstanceState(Bundle savedInstanceState) {   
    // Save UI state changes to the savedInstanceState.
    // This bundle will be passed to onCreate if the process is
    // killed and restarted.
    super.onSaveInstanceState(savedInstanceState);
  }

  // Called at the end of the active lifetime.
  @Override
  public void onPause(){
    // Suspend UI updates, threads, or CPU intensive processes
    // that don뭪 need to be updated when the Activity isn뭪
    // the active foreground activity.
    super.onPause();
  }

  // Called at the end of the visible lifetime.
  @Override
  public void onStop(){   
    // Suspend remaining UI updates, threads, or processing
    // that aren뭪 required when the Activity isn뭪 visible.
    // Persist all edits or state changes
    // as after this call the process is likely to be killed.
    super.onStop();
  }

  // Called at the end of the full lifetime.
  @Override
  public void onDestroy(){
    // Clean up any resources including ending threads,
    // closing database connections etc.
    super.onDestroy();
  }
}

// ******************************************************************* //


- 액티비티가 다시 활성화 될때 전과 동일한 UI를 나타낼수있도록 하려면,
   OnSaveInstanceState를 이용하여 UI상태(체크박스상태, 사용자 포커스...)를 저장
- OnPause 메서드에서 저장되지 않는 변경을 저장, 액티비티가 포그라운드에 있지 않을 때 스레드나 프로세스 혹은 브로드캐스트 리시버를 일시 중단하고자 할 경우
- UI 상태를 다시 읽어들이는 것은 onCreate와 onRestoreInstanceState 메서드이므로 onResume에서는 필요없다
- onResume, onPause는 빠르게 처리되도록하는것이 좋다
- onPause에서 중단된 브로드케스트 리시버나 다른 처리를 재등록하려면 onResume을 이용


'안드로이드 > 고급' 카테고리의 다른 글

[PAAD] 4장 메뉴  (0) 2011.08.17
[PAAD] 4장 커스텀 뷰 만들기  (2) 2011.08.14
[PAAD] 4장 리소스 드로어블 (링크_참고자료)  (0) 2011.08.14
[PAAD] 3장 리소스 다루기  (0) 2011.08.13
[PAAD] 2장 시작하기 정리  (0) 2011.08.12