[ Do it! ] 안드로이드 앱 프로그래밍 - #3. 어플리케이션 구성하기 (5)

ma.caron_g·2022년 3월 29일
0

Do it! - Android Studio

목록 보기
11/18
post-thumbnail

1.액티비티 생명주기

1-1. 액티비티 생명주기

액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해 실행과 중지 그리고 메모리에서 해제되는 여러 과정을 상태 정보로 가지고 있게 되고 이러한 상태 정보는 시스템에서 관리하면서 각각의 상태에 해당하는 메소드를 자동으로 호출하게 됩니다.

상태설명
실행 (Running)화면 상에 액티비티가 보이면서 실행되어 있는 상태
액티비티 스택의 최상위에 있으며 포커스를 가지고 있음
일시 중지 (Paused)사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태
대화상자가 위에 있어 일부가 가려져있는 경우에 해당함
중지 (Stopped)다른 액티비티에 의해 완전히 가려져 보이지 않는 상태

이렇게 액티비티의 상태 정보가 변화하는 것을 액티비티의 '수명주기(Life Cycle)'이라 하며 액티비티가 처음 만들어진 후 없어질 때까지 상태가 변화하며서 각각에 해당하는 메소드가 자동으로 호출되게 됩니다.

onCreate() -> onStart() -> onResume() 이후 액티비티가 화면에 보이게 됩니다.
실행된 액티비티에 다른 액티비티가 상위에 오게 되면 onPause()메서드가 호출되면서 일시 정지가 됩니다.
그 후 다시 실행하게 되면 onResume()메서드가 호출되어 액티비티를 다시 실행시킵니다.
onStop() 메서드는 중지 상태로 변경 될 때 자동으로 호출되는 메서드입니다.
만약 액티비티가 메모리 상에서 없어질 경우 onDestroy()메서드가 호출됩니다.

상태 메서드설명
onCreate()액티비티가 처음에 만들어졌을 때 호출
화면에 보이는 뷰들의 일반적인 상태를 설정하는 부분
이전 상태가 저장되어 있는 경우에는 번들 객체를 참조하여 이전 상태 복원 가능
ㅇ이 메서드 다음에는 항상 onStart() 메서드가 호출
onStart()액티비티가 화면에 보이기 바로 전에 호출
액티비티가 화면 상에 보이면 이 메서드 다음에 onResume() 메서드가 호출
액티비티가 화면에서 가려지게 되면 이 메서드 다음에 onStop() 메서드 호출
onResume()액티비티가 사용자의 상호 작용하기 바로 전에 호출
onRestart()액티비티가 중지된 이후에 호출되는 메서드로 다시 시작되기 전에 호출
이 메서드 다음에는 항상 onStart() 메서드가 호출
onPause()또 다른 액티비티를 시작하려고 할 때 호출
저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메서드
이 메서드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행하는 메서드
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음
onStop()액티비티가 사용자에게 더 이상 보이지 않을 때 호출
액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출
액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음
onDestroy()액티비티가 소멸되어 없어지기 전에 호출
이 메서드는 액티비티가 받는 마지막 호출
액티비티가 어플리케이션에 의해 종료되거나 (finish() 메서드 호출) 시스템이 강제로 종료시키는 경우 호출될 수 있음
액티비티가 이 상태에 들어가면 이 시스템은 액티비티를 강제 종료할 수 있음

1-2. 생명주기 실행해보기

package com.study.doit;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

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

        Toast.makeText(getApplicationContext(), "onCreate() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onStart() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onResume() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onRestart() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onPause() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onStop() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onDestroy() 실행됨.", Toast.LENGTH_SHORT).show();
    }

}
  • 위와 같이 코드를 작성하고 어플을 실행시켜보고(onCreate() onStart() onResume())
  • 홈 화면으로 나가보고 (onPause() onStop())
  • 다시 실행시켜보고 (onResume() onStart() onResume())
  • 멀티태스킹에서 어플을 지워 종료해본다 (onPause() onStop() onDestroy())

이렇게 시스템에서 자동으로 호출하는 메소드를 콜백 메서드(Callback Method)라고 합니
다.

화면이 보일 때와 화면이 보이지 않을 때 항상 호출되는 메서드가 있습니다.
바로 onResume()onPause() 메서드 입니다.
이 두 개의 메서드는 아주 중요합니다. 왜냐하면 앱이 갑자기 중지되거나 또는 다시 화면에 나타날 때 앱 데이터의 저장과 복원이 필요하기 때문입니다.
예를 들어, 게임을 할 때 사용자의 점수가 갑자기 사라지지 않도록 onPause() 메서드 안에 데이터를 저장하고 onReusme() 메서드 안에서 복원해야 합니다.

1-3. SharedPreferences

앱 안에서 간단한 데이터를 저장하거나 복원할 때는 SharedPreferences를 사용할 수 있습니다.
이것은 앱 내부에 파일을 하나 만드는데 이 파일 안에서 데이터를 저장하거나 읽어올 수 있도록 합니다.

개발자는 실제로 파일을 만들 필요 없이 SharedPreferences의 저장, 복원 메서드를 사용하면 됩니다.

package com.study.doit;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    EditText edtContent;

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

        edtContent = (EditText) findViewById(R.id.edtContent);
        Toast.makeText(getApplicationContext(), "onCreate() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onStart() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onResume() 실행됨.", Toast.LENGTH_SHORT).show();
        // 설정 정보에 저장된 데이터를 복원
        restoreState();
    }

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

        Toast.makeText(getApplicationContext(), "onRestart() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onPause() 실행됨.", Toast.LENGTH_SHORT).show();
        // 현재 입력 상자에 입력된 데이터를 저장
        saveState();
    }

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

        Toast.makeText(getApplicationContext(), "onStop() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

        Toast.makeText(getApplicationContext(), "onDestroy() 실행됨.", Toast.LENGTH_SHORT).show();
    }

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

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

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

위와 같이 작성하면
어플 실행 후 소멸(Destroy)시키고 다시 실행시켜도 데이터가 저장된 상태로 어플이 실행됩니다.


saveState() 메서드는 현재 입력상자에 입력된 데이터를 저장합니다.

  1. 데이터를 저장할 때는 SharedPreferences를 사용하여 sp문자열을 저장소의 이름으로 사용합니다.
  2. SharedPreferences 객체를 사용하려면 getSharedPreferences() 메서드를 참조합니다.
  3. SharedPreferences.Edit 객체는 데이터를 저장할 수 있도록 edit() 메서드를 제공하는데 edit() 메서드를 호출한 후 putOOOO() 메서드로 저장하려는 데이터를 설정할 수 있습니다.
  4. 데이터 저장 후에는 commit() 메서드를 호출해야 실제로 저장됩니다.

restoreState() 메서드는 설정 정보에 저장된 데이터를 가져옵니다.

onSaveInstanceState()onRestoreInstanceState() 메서드도 액티비티의 상태와 관련하여 호출되므로 앞에서 사렾본 코드 대신 사용될 수 있습니다.

profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글