안녕하세요?


이번 포스팅에서는 [Do it 안드로이드 앱 프로그래밍]이라는 책을 읽으면서, 이번 포스팅에서는 액티비티의 수명주기라고 해서, 액티비티(화면)가 띄워지고 나서 꺼질때 까지의 주기를 알아보는 실습을 하였으며, 동시에 데이터를 저장해서 화면이 바뀌거나 종료되어도, 데이터가 지워지지 않는 것을 실습해 보았고, 그 내용을 포스팅 하고자 합니다.


먼저 SampleLifecycle이라는 프로젝트를 생성한 다음, 아래의 그림과 같이 activity_main.xml을 생성하도록 합니다.



책에서는 텍스트뷰라는 식으로 이야기를 했지만, 여기서는 입력상자를 배치하도록 하고, 그 아래에서는 버튼을 배치하도록 하고, 앞으로의 코딩을 편하게 하기 위해서 onClick속성을 위 스크린샷과 같이 배치하도록 합니다.



먼저 MainActivity.java로 가서, 위 화면과 같이 코딩을 하는데, 이번에는 일일히 손으로 직접 입력하지 않고, 코딩화면에서 우클릭을 한 다음, Generagte메뉴를 클릭합니다. 그리고 나서 Override Methods를 선택하면 여러개의 화면으로 뜨는 리스트가 있는데, 여기서 onStart, onStop, onResume, onPause, onDestroy를 차례대로 고르도록 합니다.


다음에는 이 메서드들이 실행되었는지 여부를 알아보기 위해서 다음 화면과 같이 Toast를 이용해서 메세지를 띄우도록 해봅니다.



각자 메세지가 뜨도록 코딩을 하였으면, 이제는 예제 프로젝트를 뜯어보고서, 거기서 나온 MainActivity.java를 가지고서 빠진 곳을 코딩하도록 합니다.



먼저 밑줄이 쳐진곳을 코딩해서 입력상자에 대한 것이 인식이 되도록 합니다. 



다음은 붉은색 박스가 쳐진 곳을 입력해서 버튼을 누르면 MenuActivity라는 것이 띄워지도록 만듧니다. 그런데 아직 새 Activity를 만들지 않았기 때문에, 새로이 액티비티를 만들도록 합니다.



Package explorer에서 Java폴더에서 우클릭을 한 다음, New메뉴를 클릭해서 새 액티비티를 만들도록 합니다. 여기서는 Activity Name은 MenuActivity로 지정을 하도록 합니다.



USB에 연결이 된 스마트폰에서 실제 앱을 실행시켜본 결과 위 스크린샷처럼 자동으로 메서드가 실행이 되는데, 이렇듯이 시스템상에서 자동으로 호출하는 메서드를 [콜백 메서드(Callback Method)]라고 합니다.

먼저 앱이 실행되면 다음과 같은 순서로 콜백 메서드가 실행이 되었습니다.


onCreat -> onStart -> onResume 


여기서 다른 액티비티를 띄우는 버튼을 눌러서 MenuActivity를 띄웠을 경우 다음과 같이 콜백 메서드가 실행되었습니다.


onPause


그리고 MenuActivity를 스마트폰의 뒤로가기 버튼을 눌러서 뒤로 갔을 경우 다음과 같이 콜백 메소드가 실행되었습니다.


onStart -> onResume


그리고 앱을 종료했을 경우 다음과 같이 콜백 메소드가 실행되었습니다.


onPause -> onStop -> onDestroy


그래거 이를 통해서 알수 있는 것이.......... 최초로 앱을 실행했을 경우에는 onCreat가 실행이 되고, 그 다음에 onStart와 onResume이 차례로 실행이 된다는 것을 알 수 있습니다.


그리고 앱이 종료되면 가장 먼저 onPause가 실행이 되고, 앱이 종료될 경우 onStop과 onDestroy가 차례대로 실행이 됩니다.


이제 화면인 액티비티가 종료되어도 데이터를 저장하는 코딩을 실습하기 위해서 먼저 아래와 같이 코딩을 합니다.



먼저 화면인 액티비티가 다른 화면으로 넘어가거나 종료되거나 하면, onPause가 실행되기 때문에, 여기다가는 save를 하는 saveState()메서드를 지정합니다.


그리고 화면인 액티비티가 다시 시작되면 onStart이후에 onResume이 실행되기 때문에, 여기서는 불러오는 load에 해당한다고 해야 할까요? resoreState()메소드를 지정합니다. 


하지만 위 스크린샷에서 보시다시피 saveState()와 restoreState()는 안드로이드 스튜디오에서 기본적으로 지정하는 메서드가 아니기 때문에, 일일히 지정해야 할 필요성이 있습니다.



위 스크린샷에서 나와있는 것 처럼 임의의 메서드를 지정하였습니다. 일단 SharedPreferences를 이용해서 따로 파일을 생성하라는 명령을 지정하지 않아도, 앱 내부에 알아서 파일을 생성, 지정된 데이터를 저장합니다. 이 방법이 주로 쓰이는 곳이 게임같은 것에서 전화가 와서 받거나 게임을 종료해도 게임내 스코어나 주인공의 레벨등을 저장할 때 사용이 됩니다.


SharedPreference 변수1 = getSharedPreferences("변수1",Activity.MODE_PRIVATE);


먼저 변수1을 지정하고 나서, getSharedPreferences() 메소드를 지정해야 데이터의 저장이나 불러오기가 가능해 집니다. 그리고 먼저 데이터의 저장을 하는 경우를 먼저 생각해 보도록 하겠습니다.


SharedPreferences.Editor 변수2 = 변수1.edit();


위 코딩은 변수2를 지정하고, 변수1에 변화를 주겠다는 의미입니다. 어떤 변화를 주는지는 이어지는 코드의 내용에 따라서 달라지게 됩니다.


변수2.putString("name",nametag.getText(),toString());


먼저 변수2는 . 뒤에 나오는데, putString()메서드인 만큼, 이 뒤에서 나오는 메서드에서 나온 문자열값을 가지겠다는 의미가 됩니다. 

우선 "name"은 여기서 가져온 문자열값의 이름입니다. 그리고 뒤에 따라오는 nametag이라는 것은 activity_main.xml에서 만들어 놓은 입력상자의 ID입니다.

이후 따라오는 getText()는 이 입력상자에 들어가 있는 텍스트를 가져오고, toString()은 이 텍스트를 String이라는 데이터 타입으로 바꾸라는 의미가 됩니다.


변수2.commit();


이 구문은 다른 의미도 아닌, 제대로 변경사항이 반영되라는 의미가 됩니다. 이 구문이 들어가야만 제대로 된 입력사항의 변화가 저장이 됩니다.

여기까지가 saveState()메서드의 내용입니다.


그럼 restoreState()메서드의 내용은 어떻냐 하면 이는 다음과 같이 됩니다.


SharedPreference 변수1 = getSharedPreferences("변수1",Activity.MODE_PRIVATE);


여기까지는 똑같습니다. 하지만, 이후는 if구문을 동원해서 다음과 같이 내용을 확인해야만 합니다.


if((변수1!=null)&&(변수1.contains("name"))){


위 코드의 내용은 변수1이 null값이 아니며, name이라는 이름의 값이 있을 경우, 아래의 내용을 실행하라는 의미가 됩니다.


String 변수3 = 변수1.getString("name","");

입력상자ID.setText(변수3);


위 코드의 내용은 다음과 같습니다. 먼저 변수3을 지정하는데, 이 내용은 문자열(String)타입의 값입니다. 이 변수3이라는 값은 변수1에서 name이라는 항목에서 값을 찾아낸 다음, activity_main.xml에서 지정한 입력상자의 텍스트를 미리 저장된-변수1에 미리 저장된 값에서 name이라는 이름의 값을 찾아내서 그 문자열을 가저와라 라는 의미가 됩니다.



그리하여 앱을 먼저 실행을 시키고 나면, 위 스크린샷과 같은 화면이 나오는데, 여기다가 저는 '저장'이라는 단어릴 지정하고 나서 앱을 종료해 보았습니다. 그리고 다시 앱을 실행시켰을 때 화면이 다음과 같았습니다.



위 화면과 같이 저장이라는 이름이 그대로 저장되어 있는 것을 볼 수 있었습니다. 어떻게 이번에는 제대로 무언가가 나온 듯 하다는 생각이 듭니다. 책에서는 더 간단한 메서드로 onSaveInstanceState()와 onRestoreInstanceState()메서드가 있다고 하는데, 제가 한번 실습을 해보고 나서, 이를 포스팅에 올리도록 해 보겠습니다.


+ Recent posts

티스토리 툴바