본문 바로가기

카테고리 없음

<Android> - 안드로이드 수명주기와 SharedPreferences

액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해서 실행과 중지, 그리고

메모리에서 해제되는 여러 과정의 상태 정보로 갖고 있으며, 이런 상태 정보는 시스템이 관리하면서

각각의 상태에 해당하는 메서드를 자동으로 호출한다!!

 

이렇듯 액티비티의 상태 정보가 변화하는 것을 액티비티의 수명주기(Life Cycle) 또는 생명주기라 한다!!

 

다음은 각각 수명주기의 상태변화를 알아보기 위해 토스트 메시지를 통해 출력해주고 여러개의 메시지가

겹치면 안보일 수 있기 때문에

public void println(String data) {
    Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    Log.d("Main", data);
}

println이라는 함수를 정의하여 Logcat창을 통해 출력 메시지를 확인해보겠다!!

 

 

 

MainActivity.java

 

package com.example.samplelifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.material.snackbar.Snackbar;

public class MainActivity extends AppCompatActivity {
    EditText nameInput;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nameInput = findViewById(R.id.nameInput);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivity(intent);
            }
        });

        Toast.makeText(this, "onCreate 호출됨", Toast.LENGTH_LONG).show();
        println("onCreate 호출됨");
    }

    @Override
    protected void onStart() {
        super.onStart();

        Toast.makeText(this, "onStart 호출됨", Toast.LENGTH_LONG).show();
        println("onStart 호출됨");
    }

    @Override
    protected void onStop() {
        super.onStop();

        Toast.makeText(this, "onStop 호출됨", Toast.LENGTH_LONG).show();
        println("onStop 호출됨");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Toast.makeText(this, "onDestroy 호출됨", Toast.LENGTH_LONG).show();
        println("onDestroy 호출됨");
    }

    @Override
    protected void onPause() {
        super.onPause();

        Toast.makeText(this, "onPause 호출됨", Toast.LENGTH_LONG).show();
        println("onPause 호출됨");

        saveState(); //현재 입력상자에 입력된 데이터를 저장
    }

    @Override
    protected void onResume() {
        super.onResume();

        Toast.makeText(this, "onResume 호출됨", Toast.LENGTH_LONG).show();
        println("onResume 호출됨");

        restoreState(); // 설정 정보에 저장된 데이터를 복원
    }

    public void println(String data) {
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
        Log.d("Main", data);
    }

    protected void restoreState() {
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        if ((pref != null) && (pref.contains("name"))) {
            String name = pref.getString("name", "");
            nameInput.setText(name);
        }
    }

    protected void saveState() {
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("name", nameInput.getText().toString());
        editor.commit();
    }

    protected void clearState() {
        SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.clear();
        editor.commit();
    }
}

앱을실행시키고 back버튼을 눌러보면 어떤 순서로 메서드가 호출되는지 Logcat창을 통해 확인할 수 있다.

이렇게 출력되는 메시지들은 액티비티 생성부터 실행까지 자동으로 메서드가 호출되기 때문이다.

이것을 '콜백 메서드(Callback Method)' 라고 한다.

 

여기서 화면이 보일 때와 보이지 않을 때 항상 호출되는 메서드가 있는데 그것이 바로

onResume , onPause 메서드로 이 두개의 메서드는 정말 중요하다.

 

앱이 갑자기 중단되거나 다시 화면에 나타날 때 앱 데이터의 저장과 복원이 필요하기 때문이다.

이럴때 앱 안에서 간단한 데이터를 저장하거나 복원할 때 SharedPreferences를 사용 할 수 있다.

실제로 파일을 만들 필요 없이 SharedPreferences의 저장, 복원 메서드를 호출하면 된다.

 

데이터 저장 복원을 테스트하기 위해 아래에 입력상자를 배치하고 MenuActivity를 만들어 다시 뒤로 돌아가 보겠다.

 

돌아가기 클릭 후

 

그대로 잘 남아있다!!!

 

감사합니다.