제이슨의 개발이야기
안드로이드 Activity 생명주기 본문
안드로이드에서는 실행되는 애플리케이션의 상태를 시스템에서 직접 관리합니다 이는 대부분의 휴대폰 os에서 사용하는 방법으로 실행된 어플의 메모리를 과도하게 점유하거나 화면을 보여주는 권한을 과도하게 가지는 것을 막기 위함입니다 예를들면 전화기의 원래 기능인 전화수신, 발신기능 자체를 사용하지 못하게 막는것을 막기 위함입니다!
그래서 어플이 실행되면 ui가 실행되고 activity 생명주기에 에 따라 os가 모니터링 하고 있습니다
위에 그림이 activity 의 생명주기 그림인대 하나씩 설명하겠습니다
onCreate()
액티비티가 처음에 만들어젔을때 호출됨
화면에 보이는 뷰들의 일반적인 상태를 설정하는 부분
이전 상태가 저장되어 있는 경우에는 번들 객체를 참조하여 이전 상태 복원 가능
이 메소드 다음에는 항상 onStart()메소드가 호출됨
onStart()
액티비티가 화면에 보이기 바로 전에 호출됨
액티비티가 화면 상에 보이면 이 메소드는 다음에 onResume()메소드가 호출됨
액티비티가 화면에서 가려지게 되면 이 메소드 다음에 onStop() 메소드가 호출됨
onResume()
액티비티가 사용자와 상호작용하기 바로 전에 호출됨
onRestart()
액티비티가 중지된 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출됨
이 메소드 다음에는 항상 onStart() 메소드가 호출됨
onPause()
또 다른 액티비티를 시작하려고 할 때 호출됨
저장되지 않은 데이터를 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메소드
이 메소드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행된 후 리턴되어야 함
onStop()
액티비티가 사용자에게 더 이상 보이지 않을 때 호출됨
액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출됨
액티비티가 이 상태에 들어가면 시스탬은 액티비티를 강제 종료 할 수 있음
onDestroy()
액티비티가 소멸되어 없어지기 전에 호출됨
이 메소드는 액티비티가 받는 마지막 호출이 됨
액티비티가 애플리케이션에 의해 종료되거나(finish() 메소드 호출) 시스템이 강제로 종료시키는 경우에 호출될 수 있음
위의 두 가지 경우를 구분할 때 isFinishing() 메소드를 이용함
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음
어떤 어플에 글을 쓰다가 전화가 오거나 혹은 갑자기 어플사용을 잠시 중단 했다가 다시 어플을 사용할 때 중단 된기 전에 썻던 내용을 다시 쓰지 않고 저장해 두다가 다시 그 시점부터 쓰고 싶을때 이런 경우에는 액티비티의 수명주기 메소드는 onPause() 와 onResume() 입니다
이 두가지 메소드는 애플리케이션이 멈추거나 없어질 때 , 그리고 애플리케이션이 다시 보이거나 새로 실행ㄹ될 때 호출되므로 이 두가지 메소드를 구현하여 애플리케이션의 상태를 저장하거나 복원해야 합니다
물론 다른 방법도 존재합니다 예를들면 액티비티가 중지되기 전에 호출되는 onSaveInstanceState()메소드를 이용해 데이터를 임시로 저장할 수도 있습니다 이 메소드의 파라미터로 전달되는 번들 객체를 이용해서 데이터를 저장하면 onCreate()메소드나 onRestoreInstanceState()메소드로 저장했던 데이터가 전달됩니다.
onPause() 와 onResume() 사용 예시
protected void Pause(){
super.onPause();
saveCurrentState(); //현재 상태 저장하는 메소드 개발자가 따로 메소드 작성해야함!!!!
}
protected void onResume(){
super.onResume();
restroreFromSavedState(); //현재 상태 복원하는 메소드 이거 역시 개발자가 따로 메소드 작성 필요!!!!
}
protected void restoreFromSavedState(){
SharePreferences myPrefs = getSharedPreferences("key",Activity.MODE_PRIVATE);
if((myPrefs !=null) && (myPrefs.contains("txtMsg"))){
String myData = myPrefs.getString("txtMsg","");
}
}
protected voidsaveCurrentState(){
SharePreferences myPrefs = getSharedPreferences("key",Activity.MODE_PRIVATE);
SharePreferences.Editor myEditor = myPrefs.edit();
myEditor.putString("txtMsg", "hello");
myEditor.commit();
}
'안드로이드' 카테고리의 다른 글
안드로이드 Ui 개발 어떤 레이아웃이 더 효율적일까? 현업에서는? (0) | 2021.03.06 |
---|---|
안드로이드 fragment 생명주기 ! (0) | 2021.03.04 |
안드로이드 서비스란 무엇일까?? 백그라운드?? (0) | 2021.03.03 |
recyclerView 아이템 들 중 원하는 아이템 혹은 위젯에 변화주기! (0) | 2021.02.19 |
[안드로이드] 채팅 중 키보드가 올라 올 때 대화 화면의 포지션이 달라지는 문제 해결!!!! (2) | 2021.02.05 |