[Android] Context

Android 2014. 9. 4. 11:06
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
 
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
 
 
안드로이드 프로그램을 하다보면 컨텍스트(Context) 라는 용어가 종종 나옵니다. 그리고 여러가지
클래스 객체의 객체 생성자에서 Context 클래스를 요구하는 경우도 흔히 볼수 있습니다.  하지만, 많은
자료에서 컨텍스트에 대한 내용은 언급 자체가 되지 않거나 말 그래도 언급만 되어 있는 경우가 많아서
간단하게라도 컨텍스트의 개념을 잡기 위해 이 강좌를 준비했습니다.
 
 
1. 일반적인 의미의 "Context"
 
    멀티태스킹(Multi-Tasking)을 지원하는 운영체제에서 Task 들은 운영체제가 정한 기준에 따라
    짧은 시간동안 작업을 번갈아가면서 수행합니다. 따라서 운영체제는 해당 Task 들의 수행상태를
    기억하기 위해서 Task 마다 실행 상태에 대한 정보를 구성하고 있는데 이것이 "Context" 입니다.
 
    그렇기때문에 Context  는 "Task Context" 를 의미합니다. 그리고 Task Context 가 가지는 내용은
    보통 CPU 의 레지스터 정보, Task 가 사용하는 메모리 등이 포함되어 있습니다. ( 운영체제에
    따라서 이 정보는 달라질 수 있습니다. )
 
 
2. 안드로이드 시스템에서 Context 클래스의 역할
 
    안드로이드 시스템은 여러가지 형태의 실행 형식( Activity, Service, ... )을 가지고 있습니다. 그렇기
    때문에 클래스 구현상 중복된 실행 정보를 가질 수 밖에 없습니다. 따라서 이런 중복된 정보를 줄이고,
    메소드를 일원화시키기 위하여 실행 클래스들의 상위클래스로써 Context 클래스를 제공하고 있습니다.
 
    안드로이드 시스템에서 모든 실행 형식을 가지는 클래스들은 Context 클래스에서 상속을 받아
    설계되었기 때문에 다형성을 적용하여 코드를 통일성있게 표현할 수 있습니다. 예를 들어
    액티비티에서 정보를 전달하기위하여 Intent 클래스를 사용하는 경우 해당 액티비티를 Intent 클래스가
    참조할 수 있도록 Intent 클래스의 생성자는 아래와 같이 선언되어야 합니다.
 
    Intent(Activity activity, ... );
 
    하지만 서비스도 Intent 클래스를 사용할 수 있기때문에 Intent 클래스는 서비스를 위하여 아래와 같은
    생성자가 추가로 필요할 것입니다.
 
    Intent(Service service, ... );
 
    그리고 또 다른 형태의 실행 형식을 가지는 클래스가 추가된다면 Intent 클래스는 그 클래스를 위하여
    객체생성자가 추가되어야하는 문제점이 생기게되어 시스템 입장에서는 유지보수가 곤란해집니다.
    따라서 안드로이드 시스템은 모든 실행 형식과 관련된 클래스들을 Context 클래스에서 계승받았기
    때문에 Intent 클래스의 객체 생성자를 아래와 같이 선언할 수 있습니다.
 
    Intent(Context context, ... );
 
    이렇게 되면 이제 이 생성자는 Activity 클래스든 Service 클래스든 둘 다 사용할 수 있을 뿐만 아니라
    나중에 또 다른 실행 형식의 클래스가 추가되어도 수정없이 위 생성자를 사용할 수 있습니다.
    예를들어, Activity 클래스에서 Intent 클래스를 사용할때는 Intent 클래스의 생성자에 this 를
    명시해서 사용하면 됩니다. this 는 Activity 객체를 의미하지만 Activity 클래스가 Context 클래스의
    자식 클래스이기 때문에 다형성에 의해서 사용이 가능합니다.
 
    public class MyActivity extends Activity implements OnClickListener
    {
        public void onClick(View view)
        {
            // SecondActivity 를 실행시킬 것을 명시한 인텐트를 생성한다.
            Intent act = new Intent(this, SecondActivity.class);
 
           ... 생략 ...
        }
    }
  
    결론적으로 안드로이드 시스템에서 Context 클래스는 다형성을 사용할 목적으로 구현되었기 때문에
    대부분의 함수들이 추상 메소드로 선언되어있고 그래서 그 자신도 추상 클래스입니다.

 출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=967

 

또 다른 참고 링크 : http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110085457720&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 

블로그 이미지

kuku_dass

,

'Android' 카테고리의 다른 글

[Android] SharedPreferences  (0) 2014.09.04
[Android] Context  (0) 2014.09.04
[Android] Fragment  (0) 2014.09.03
[Android] Recreating an activity - Save and Restore  (0) 2014.09.03
[Android] Action Bar - Up Navigation 기능 사용하기 (Up Button)  (0) 2014.09.03
블로그 이미지

kuku_dass

,

[Android] Fragment

Android 2014. 9. 3. 17:14
블로그 이미지

kuku_dass

,

activity가 종료되는 경우는 몇 가지의 시나리오로 존재한다.

1. 유저가 back버튼을 누른 경우.
2. 오랜시간 사용하지않아, 시스템이 종료시킨 경우

등등 많은 경우가 존재한다.


유저가 back버튼을 누르거나, activity가 정상적으로
종료되었을 경우 acitivty 는 영원히 사라진다.
(위와같은 행동은, 더 이상 activity가 필요치 않다고
 고려되고 행동되었을 것이기 때문이다.)

하지만, 시스템의 사정에 의해서 종료가 되는 경우
시스템은 Bundle 이라는 객체 안에 key-value pair로
각각의 View 나 layout 등의 값을 저장해 놓는다.
TextView 안에 써놨던 값 등등..

  이렇게 기본적으로 시스템이 bundle 객체를 이용하여 백업을 하지만,
사용자가 추가적으로 임의의 데이터를 저장하고, 복구할때 사용하고자 한다면

onSaveInstanceState(), onRestoreInstanceState() 함수를 override 하면 된다.

 

 

 

Save Your Activity State

To save additional state information for your activity, you must implement onSaveInstanceState() and add key-value pairs to the Bundle object. For example:

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);
}

위와 같이 activity 파일 안에, onSaveInstanceState() 함수를 재정의해놓고, 백업작업을 해놓고,

acitivty를 스크린 off 를 이용하여 종료하면, 다음과 같이 함수가 호출된다.(back key를 눌러서 activity를 종료하면

onPause() -> onStop() 순으로 호출된다... 왜냐면 back key자체가, 진짜 종료하려고 누른것으로 판단하고)

 

onPause() -> onSaveInstanceState() -> onStop()

Restore Your Activity State
@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
   
}
   
...
}
 

위와 같이, onCreate() 함수에서, restore 작업을 할 수 있다.

만약 , onRestoreInstanceState() 함수를 사용하고 싶다면, 재정의해서 아래와 같이 정의해놓고 쓰면된다.

 

onRestoreInstanceState() 함수는, system이, bundle에 백업해놓은 데이터가 있을때 자동적으로

호출되므로, 따로 savedInstanceState != null 등의, 코드가 필요없다.

 

 

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);
}

 

 

 

모든 출처 : http://developer.android.com/training/basics/activity-lifecycle/recreating.html#RestoreState

 

 

 

'Android' 카테고리의 다른 글

[Android] Context  (0) 2014.09.04
[Android] Communicating with Other Fragments  (0) 2014.09.04
[Android] Fragment  (0) 2014.09.03
[Android] Action Bar - Up Navigation 기능 사용하기 (Up Button)  (0) 2014.09.03
[Android] Acitivy LifeCycle  (0) 2014.09.03
블로그 이미지

kuku_dass

,

Action Bar의 Up 버튼 사용방법.

1.먼저 두 개의 액티비티가 존재하는 프로그램을 셋팅.

2.두 액티비티 중, 홈 액티비티(parent)로 사용될 액티비티를 정하자.

3. 다른 하나의 액티비티를 child 라고 하자.


결국 action bar 내의 Up 기능은, 어느 child액티비티 안에서도
한번의 터치만으로, 가장 상위의 parent 액티비티로 쉽게
이동하고자 제공되는 기능이다.

해당 기능을 구현하기 위해서는 아래의 두 가지 조치를 취해야 한다.

1. child activity의 onCreate()함수 내에, 아래의 코드 추가

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

위 코드를 추가하고 프로그램을 실행해 보면, child activity의
action bar 좌측에, '<' 버튼이 생성되어 있다.

(위 1번 조치만 하고, '<' 실행 시, parent activity로 이동되지 않음)


2. 프로젝트의 AndroidMenifest.xml 에서, child activity 부분에서도 아래의 코드 추가
<activity  ~ /> 안에  <meta-data /> 부분을 추가해주자. (parent activity의 이름(android:value)을 설정)

        <activity
            android:name=".ChildActivity"
            android:label="@string/title_activity_child"
            >
            <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />

        </activity>


위 1,2 단계를 모두 수행해야, child activity의 action bar에서 Up('<') Navigation 기능을 이용 할 수 있다.

'Android' 카테고리의 다른 글

[Android] Context  (0) 2014.09.04
[Android] Communicating with Other Fragments  (0) 2014.09.04
[Android] Fragment  (0) 2014.09.03
[Android] Recreating an activity - Save and Restore  (0) 2014.09.03
[Android] Acitivy LifeCycle  (0) 2014.09.03
블로그 이미지

kuku_dass

,
1. 액티비티 시작

  - main()으로 시작되는 일반적 언어와 달리 안드로이드는 특별한 콜백 메소드를 호출함으로써 액티비티를 실행

  - 안드로이드는 아래 그림과 같이 피라미드 형태의 일련의 life cycle 메소드를 콜. 새 액티비티가 생성되면 한단계씩 위의 메소드를 콜한다. 즉, 현재 foreground에 있는 액티비티가 아래 그림에서 가장 탑에 위치한다. (Resumed 상태)
    액티비티가 사라질때는 반대로 내려감. 특정 지점에서 멈춘 후 다시 올라갈 수도 있음

  - 실제 액티비티는 오로지 세가지 상태로만 존재 (아래의 나머지 상태는 모두 거쳐간다는 의미)
    1) Resumed : foreground에 있음
    2) Paused : 다른 액티비티에 의해 뒤에 숨어있음. foreground에 있는 액티비티는 반투명 상태이거나 전체화면이 아닌 상태.
    3) Stopped : 완전히 백그라운드에 있음. 멤버 변수는 모두 보존됨.
  


  - 앱 실행 시 최초로 onCreate를 호출할 액티비티는 AndroidManifest.xml 파일에서 선언. MAIN 액션과 LAUNCHER 카테고리를 포함하는 <intent-filter>에 선언
      <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>

  - onCreate 실행 후 바로 onStart, onResume이 실행됨. 실제로 화면에 앱이 뜨는것은 onStart를 콜했을때이나, 바로 onResume 메소드가 콜되면서 resumed 상태로 넘어감

  - onDestroy 메소드가 마지막으로 실행되나, 그 전에 onPause, onStop이 순서대로 실행됨. 여기서 대부분의 앱 리소스를 정리
    단,
    1) onCreate에서 백그라운드로 쓰레드를 돌린 경우/메모리 누수 발생 가능한 long-running 리소스가 있으면 onDestroy 에서 해결
    2) 다른 앱을 띄우는 임시 앱 등 onCreate에서 finish()를 콜하여 앱을 끝내는 경우 onPause, onStop 없이 바로 onDestroy가 실행

2. Pause

  - Resumed 상태에서 paused 상태로 넘어가면 onPause() 메소드가 호출되고, 반대인 경우 onResume() 메소드를 호출. Paused 상태의 원리 의미는 잠시 멈춤 상태이지만, 보통 곧 액티비티를 떠나고 stopped 상태로 들어갈 것임을 의미

  - onPause()에서 주로 하는일
    1) CPU 잡아먹는 애니메이션 등의 동작 stop
    2) 저장되지 않은 변화를 저장 (commit)
    3) 센서 핸들, broadcast receiver 등 시스템 자원 반납

  - 그렇다고 onPause 에서 무조건 변화를 저장해선 안됨. auto-save가 활성화 되었을때만. 그리고 onPause에서 DB의 사용은 다음 액티비티로 전환하는 속도를 떨어뜨림

3. Resume

  - Paused 상태에서 액티비티를 재활성화하면 onResume() 메소드가 호출

  - onResume()은 pause 상태에서 resume 상태로 넘어갈 때 뿐 아니라 최초 액티비티 기동시에도 호출된다는것을 명심

4. Stop

  - 액티비티가 stopped 상태라도 액티비티 인스턴스는 메모리에 남아있음. 따라서 onStop 메소드는 구현하지 않을때가 많음

  - 그러나, 시스템이 메모리 회복을 위해 onDestroy() 콜 없이 강제로 인스턴스를 제거할 수 있으므로 leak 방지를 위해 release를 철저히 해주어야 함

  - 시스템은 레이아웃에 있는 각 뷰의 현재 상태를 저장하고 있으므로 onStop 안에서 해당값을 저장할 필요는 없음

4. Restart/Start

  - 액티비티가 foreground로 오면 onRestart()/onStart() 메소드가 차례대로 호출됨

  - stopped 상태에서도 대부분의 상태가 그대로 남아있으므로 onRestart가 할 일은 딱히 없음

  - 오히려 onStop의 카운터 파트는  자원을 초기화하는 의미에서는 onStart 가 맞다

5. Recreating

  - back 버튼을 누르거나 finish()를 콜함으로써 종료된 경우는 정상종료라고 판단하여 시스템이 별다른 조치를 취하지 않음

  - stopped 상태의 액티비티를 시스템이 강제 종료한 경우, 이전 상태-instance state-를 key-value의 collection으로 Bundle 오브젝트에 저장함

  - 화면이 회전하면 항상 destroy 되었다가 recreate 됨

  - View 오브젝트는 자동으로 저장되지만(기준은 android:id로 unique한 id를 갖는 뷰), 기타 변수 등은 Bundle 오브젝트에 key-value 쌍으로 저장해야 함

  - onSaveInstanceStat()/onRestoreInstanceState() 메소드를 오버라이드

  - 액티비티가 recreate 인지 최초 create인지를 확인하려면 onCreate() 안에서 반드시 Bundle이 null 인지를 판단해야함. 최초라면 null이다.

  - 또는, onStart()에서 불려지는 onRestoreInstanceState()를 오버라이드 해도 됨. 이 메소드는 Bundle이 null 이 아닐때만 실행되므로 Bundle 오브젝트를 확인할 필요는 없음


* 출처 : http://developer.android.com/training/basics/activity-lifecycle/index.html

 

 

## Google Android Site ## - http://developer.android.com/reference/android/app/Activity.html

State diagram for an Android Activity Lifecycle.

블로그 이미지

kuku_dass

,