인코딩의 Decoding

반응형

어플을 사용할때 사용자가 화면에서 Back버튼을 누르거나 코드 상에서 finish() 메소드를 통해 Activity가 종료되는 경우 에는 화면에 남아 있는 정보를 사용할 필요를 느끼지 못한다.

이와 달리 화면 회전 등과 같이 화면의 구성만 변경되는 경우에는 사용자는 화면에 있는 데이터들을 다시 사용하기 원한다. 하지만 화면 회전 또한 Activity가 종료되고 다시 생성되는 과정을 거치며 화면에 있는 데이터들을 다시 사용하기 원한다면 데이터를 어디엔가 저장해 놔야할 것이다.

  • Activiy가 다시 생성될때 사용할 데이터를 인스턴스라고 한다.
  • 인스턴스는 Bundle이라는 객체에 '키-밸류' 형태로 저장된다.
  • Bundle은 주로 onSaveInstanceState() 메소드에서 관리할 수 있다.
  • 그래서 화면 회전 등과 같은 과정에서 onSaveInstanceState()를 재정의,사용하여 인스턴스를 저장한다.
  • onSaveInstanceState()는 onStop() 메서드가 호출될때 호출된다.
  • Bundle에 onSaveInstanceState()를 활용하여 데이터를 저장하는 과정에서 직렬화 과정을 거친다.
  • 직렬화 과정은 큰 데이터 처리에는 알맞지 않으므로 보통 인스턴스 관리에 ViewModel 객체를 같이 사용한다.

ViewModel은 다음번에 알아보고 이번 글에서는 onSavedInstanceState() 메소드를 통해 인스턴스 정보를 저장 및 호출해보겠습니다.

 

예시)) 화면 회전할때 EditText에 있는 데이터를 인스턴스(Bundle)에 저장하고 호출하기

 

1. 초기화면

 

초기화면

 

2. 코드

public class MainActivity extends AppCompatActivity {
  //화면에 있는 editText용 변수 선언
  EditText editText;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Activity가 Create 됐을때 Bundle이 null인지 아닌지 체크
    if(savedInstanceState != null) {
      //Bundle이 null이 아니라면 Toast 메세지로 보여준다.
      Toast.makeText(this, savedInstanceState.getString("editString"),Toast.LENGTH_LONG).show();
    }
  }

  //Activity가 onStop() 됐을때(화면이 회전될때) 호출된다.
  @Override
  public void onSaveInstanceState(Bundle savedInstanceState){
    //상위 클래스를 호출하는 것은 필수 - 뷰의 계층 구조 상태를 복원하기 위함
    super.onSaveInstanceState(savedInstanceState);
    editText = findViewById(R.id.editText);
    String editString = (String)editText.getText().toString();
    //Bundle에 데이터 넣어주기(key - value)
    savedInstanceState.putString("editString",editString);
  }
}

 

3. 결과 - 화면이 회전 될때 마다 인스턴스(Bundle)에 저장되고 onCreate() 메서드에서 호출 할 수 있다.

 

가로 화면(세로화면 EditText에 있던 데이터가 Bundle에 저장됐고 새로운 Activity에서 Toast를 통해 호출됐다.)
세로 화면(가로화면 EditText에 있던 데이터가 Bundle에 저장됐고 새로운 Activity에서 Toast를 통해 호출됐다.)

 

 

참고 - "핵심 개발자 주제 - 액티비티" , android 개발자 사이트

https://developer.android.com/guide/components/activities/activity-lifecycle.html

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band