안드로이드 개발 질문/답변
(글 수 45,052)
안드로이드의 Activity Life Cycle에 대해서 궁금한 것이 있습니다.
다음과 같이 코드를 만들었습니다.
public class Test_Main extends ListActivity implements OnClickListener{
public Test_Main(){
Log.i("Test", "SRC_Main");
}
public void finalize(){
Log.i("Test", "finalize");
}
public void onCreate(Bundle savedInstanceState) {
Log.i("Test", "onCreate");
}
protected void onStart() {
Log.i("Test", "onStart");
}
protected void onDestroy() {
Log.i("Test", "onDestroy");
}
protected void onStop() {
Log.i("Test", "onStop");
}
}
이와 같이 코드를 구성하고 Activity가 실행이 될때 나오는 Log를 출력해보면
TestMain -> onCreate -> onStart
와 같이 출력 됩니다.
그래서 Back Key를 눌러 Activity를 종료하면
onStop -> onDestroy
와 같이 출력이 됩니다.
그리고 다시 Activity를 실행하면
TestMain -> onCreate -> onStart
와 같이 처음 실행했을때의 루틴 그대로 출력이 됩니다.
마찬가지로 Back Key를 눌러 Acitivty를 종료하면
onStop -> onDestroy
와 같이 출력이 됩니다.
이와 같은 동작을 몇번 수행하다보면,
finalize
가 출력이 됩니다.(생성된 횟수만큼 출력됩니다.)
여기서 궁금한 것은 Activity life cycle을 보면, OS 상황에 따라 Memory에 Activity가 남아 있다가 동일한 activity가 호출되면, onRestart()를 거쳐서 재사용이 된다고 하던데, 제가 Test한 결과 재사용이 전혀 이루어지지 않고 있습니다.
혹시 재사용을 하기 Memory에 적재된 Activity를 재사용 하기 위한 방법이 있나요?
제가 이와같이 Test한 이유는 생성 부에 DB 연결을 해놓고 Activity가 실행 중이거나 Memory에 적재되어 있는 경우, DB 접속으로 인한 수행 시간 delay를 최소화 하고자 하고 싶습니다.
이렇게 코딩을 해보니, DB 연결로 인해 소요되는 Delay 뿐만 아니라, DB 연결 개수가 늘어나는 문제가 있어서 나중에는 DB Connection full 오류가 발생하더라구요.
답변 부탁 드립니다.
===================================
Test 방법에 대해서 다시 정리하여 질문을 드립니다.
back Key를 언급했던 것은 Test 방법에 대해서 간단히 설명하기 위함이고요.
제가 Test했던 방법은
생성자에서 DB와 연결을 합니다.
onCreate에서 연결된 DB에서 Data를 가져와서 List에 뿌립니다.
그리고, finalize()에서 DB 연결을 해제합니다.
이때 Manifest.xml에서 android:screenOrientation="portrait"를 설정하지 않았기 때문에 Phone을 가로로 눕히거나, 세로로 세우는 것에 따라서 화면이 변경이 됩니다.
그런데, 화면이 변경될때마다 제 예상으로는 onRestart() 또는 onStart()가 호출될 것으로 예상을 하였는데, 실제로는 생성자 부터 onCreate() -> onStart()를 거치게 됩니다.
이로 인해 Phone을 눕히거나, 세우게 되면, 계속 DB 연결이 이루어져서 언제가는 Connection full이 되어서 Data를 가져오지 못하는 문제가 발생을 합니다.
그래서 이에 대해서 해결할 수 있는 방법을 찾고 있었던 것 입니다.
2011.03.07 11:32:54
(추천:
1 / 0)
위 코드 상으로는 back key 를 별다른 처리를 안했기 때문에 액티비티가 종료됩니다.
종료시 라이프사이클 상태는
onPause -> onStop ->onDestory 순으로 처리 됩니다.
위에 보신봐가 맞는 상태입니다.
근데 의문하신 onRestart 가 언제 호출되시는게 의무이신데
back key 가 아닌 home key를 눌러 보시면 백그라운드 상태로 진입하기 때문에
onPause -> onStop 까지만 이루어집니다.(onDestory 는 호출 안됨)
이 상태에서 다시 실행할경우
문의사한 내용의 onCreate가 건너띄고 onRestart 를 보실수 있으실것입니다.
2011.03.07 14:15:31
(추천:
1 / 0)
별다른 설정이 없을 경우
(보통 manifest.xml 파일의 android:screenOrientation="portrait" 설정 or 소스상에서도 가능)
폰을 눕폈다가 세웠다가 한다는것은
폰의 화면 전환 이벤트가 이루어지게 됩니다.
화면 전환이 이루어지면 액티비티 종료가 되면서 다시 시작하게 됩니다.
결국 처음처럼 oncreate 부터 시작하게 되지요~
여기서 차이점은 처음 oncreat 시에는 savedInstanceState = null 값이지만
화면 전환후에는 savedInstanceState != null 입니다
저두 이값은 사용해보진 않았네요
public void onCreate(Bundle savedInstanceState)
2011.03.07 11:36:28
(추천:
1 / 0)
제가 아는 만큼 답변을 드려 보도록 하겠습니다.
우선 컴천재님의 테스트 방법이 잘못 된거 같습니다. back 키를 누른다는건 해당 액티비티를 종료한다는 의미입니다.
그렇기 때문에 onDestroy가 실행이 되는 것이구요. 만약 여러 액티비티가 있는 경우 어떠한 이벤트에 따라 현재 액티비티가 온포즈 상태이거나 온 스탑일 경우에 다시 이전에 그 액티비티가 실행되면 onRestart()가 불려 지게 됩니다.
테스트 해보실때 여러 가지 상황을 두시고 액티비티를 왔다 갔다 하시면서 테스트를 해보시면 좋을 듯 싶습니다.
그리고 플래그 옵션도 추가하셔서 커스텀하게 액티비티 전환을 해보시면 그 역시 도움이 되리라 생각 되는 군요.



