2022. 3. 7. 13:58ㆍ모바일/Android_Java
아래 코드는 안드로이드 프레임워크에서 Activity의 상태에 따라 호출하는 대부분의 함수를 나열했다.
각각 로그를 찍어서 각 함수의 실행 순서를 테스트하여 정리한다.
public class TestAppActivity extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestAppActivity", "onCreate");
setContentView(R.layout.main);
Button btnAuth = (Button) findViewById(R.id.btn_finish);
btnAuth.setOnClickListener(this);
Button btnPopup = (Button) findViewById(R.id.btn_popup);
btnPopup.setOnClickListener(this);
Button btnNewAct = (Button) findViewById(R.id.btn_new_activity);
btnNewAct.setOnClickListener(this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
Log.d("TestAppActivity", "onPostCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TestAppActivity", "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TestAppActivity", "onRestart");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TestAppActivity", "onStop");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("TestAppActivity", "onPostResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TestAppActivity", "onPause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TestAppActivity", "onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("onPostCreate", "onDestroy");
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_finish:
finish();
break;
case R.id.btn_popup:
AlertDialog.Builder ab=new AlertDialog.Builder(TestAppActivity.this);
ab.setMessage(Html.fromHtml("<strong><font color=\"#000055\">Title</font></strong><br> Message!!"));
ab.setPositiveButton("OK", null);
ab.show();
break;
case R.id.btn_new_activity:
Intent intent = new Intent(getBaseContext(), NewActivity.class);
startActivity(intent);
default:
break;
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.d("TestAppActivity", "onRestoreInstanceState");
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d("TestAppActivity", "onSaveInstanceState");
super.onSaveInstanceState(outState);
}
@Override
public void onLowMemory() {
Log.d("TestAppActivity", "onLowMemory");
super.onLowMemory();
}
}
onCreate()
시스템에 의해 호출되면 인자로 받은 Bundle은 null이다. [Case1]
Activity가 실행된 적이 있는데, 어떤 이유로 종료된 후 재시작되면, 종료될 때 호출된 onSaveInstanceState()에서 저장한 내용과 동일한 Bundle을 넘겨준다.
디바이스가 회전되어 가로/세로 전환 등 리소스를 새롭게 갱신되어야 할 때 호출된다. [Case5]
onDestroy()
Activity내부에서 finish()를 실행하면 호출된다. [Case7]
시스템 메모리가 부족하면, 안드로이드가 강제로 TestApp을 죽일 때도 호출이 되는데, 메모리 확보가 매우 시급할 때는 호출조차 되지 않는 경우도 있다.
onCreate()와 짝을 이뤄 사용했던 리소스는 이 곳에서 싹~ 치워준다.
onStart()
전화수신, SMS수신 등으로 Background로 갔다가 다시 전면으로 나올때도 호출된다. [Case2, Case3, Case4]
onRestart()
onStop()
onResume()
(책에서는 팝업 대화상자가 떳다가 닫히는 경우에도 호출된다고 하지만, AlertDialog로 테스트 했을 때에는 호출되지 않았다.)
onPause()
Activity가 사용자의 시선에서 가려지는 경우에 호출된다고 생각하면 된다.
대부분의 상황에서 onStop() 발생하기 이전에 불린다.
*일반적으로 onResume()과 쌍으로 보고, onResume()에서 했던 작업을 onPause()에서 정리, 멈추는 것이 좋다.
예를 들면, onResume()에서 쓰레드를 실행시켰으면, onPause()가 호출될 때, 아직 쓰레드가 실행중이면 정리를 해주면 된다.
*onPause()가 호출되서 App(또는 Activity)이 일시정지된 상태라면 안드로이드 시스템에서 필요에 따라 완전이 죽일 수 있기 때문에 그 이후의 작업을 못할 수도 있다는 점을 유의해야한다.
onSaveInstanceState()
현재의 Activity 상태를 저장하려면 이 함수를 구현한다.
호출될 때, Bundle 인스턴스를 넘겨주는데 이를 이용해서 저장하면 되는데, 예를 들어 에디트박스에 입력된 문자열 등을 저장해 두면 된다.
onRestoreInstanceState()
주의할 점은 onRestoreInstanceState()는 정상적인 상황에서는 호출되지 않는다.
테스트 결과 일반적인 상황이 아닌, 디바이스의 화면회전이 발생할 때[Case5] , 강제종료 후 제시작 할 때 [Case6] 발생했다.
onPostCreate() 와 onPostResume()
onLowMemory()
안드로이드 Dev 사이트를 참고하여 설명하면, 이 함수가 정확히 호출되는 시점은 명확하지 않고, 다만, Background에서 실행하는 프로세스가 죽임을 했을 때, 호출된다고 한다. 시스템은 현재 Foreground에 있는 App에게 메모리를 좀 확보해 주십사~하고 호출해 주는 것이다. 즉, 이 함수에서는 필요없는 리소스를 최대한 확보하는 코드를 넣어주면 시스템에서 매우 고마워한다는 것이다.
이 함수가 return되는 순간 시스템은 GC를 수행한다고 한다.
[Case 1]
App 초기실행
[Case 2]
HOME 버튼(하드웨어키) 눌러서 안드로이드 홈으로 이동시
TestApp 아이콘을 선택하여 재시작
[Case 3]
이전버튼(하드웨어키)을 눌러서 안드로이드 홈으로 이동시
다시, TestApp 아이콘을 선택하여 재시작
[Case 4]
TestApp 실행상태에서 SMS수신, 전화수신 등이 되었을 때,
또는, HOME버튼(하드웨어키)를 길게 눌러 최근 사용한 다른 App을 띄워 TestApp이 Background이동시
SMS수신, 전화수신, 다른 앱에서 이전버튼(하드웨어키)를 눌러 뒤에 숨어있던 TestApp이 Foreground로 올라올 때
[Case 5]
디바이스를 회전시켜, 세로에서 가로화면으로 전환 시킬때, 또는 그 반대의 경우
[Case 6]
프로세스 킬러App(마켓에 널려있는..)으로 TestApp을 강제로 죽인 후, 재 실행 시켰을 때
[Case 7]
TestApp에 있는 버튼을 눌러 finish()를 강제로 호출할 때
[Case 8]
새로운 Activity를 띄웠을 때
새로 띄웠던 Activity를 닫았을 때
출처: https://mydevromance.tistory.com/21 [My Dev Romance]
'모바일 > Android_Java' 카테고리의 다른 글
[Android] Constraint Left vs Start , Right vs End (0) | 2022.03.11 |
---|---|
[Android] ViewModel clear(초기화) 및 데이터가있는 livedata duplicate observe (0) | 2022.02.23 |
[Android] 특수문자 제거 (0) | 2022.02.16 |
[Android] TabLayoutMediator (tabselectedListener not call + viewPager not changed) (0) | 2022.01.07 |
[Android] CheckBox CompoundButton.OnCheckChangeListener not working first call (0) | 2021.12.23 |