액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터 시작해 실행과 중지 그리고 메모리에서 해제되는 여러 과정을 상태 정보로 가지고 있게 되고 이러한 상태 정보는 시스템에서 관리하면서 각각의 상태에 해당하는 메소드를 자동으로 호출하게 됩니다.
상태 | 설명 |
---|---|
실행 (Running) | 화면 상에 액티비티가 보이면서 실행되어 있는 상태 액티비티 스택의 최상위에 있으며 포커스를 가지고 있음 |
일시 중지 (Paused) | 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태 대화상자가 위에 있어 일부가 가려져있는 경우에 해당함 |
중지 (Stopped) | 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태 |
이렇게 액티비티의 상태 정보가 변화하는 것을 액티비티의 '수명주기(Life Cycle)'이라 하며 액티비티가 처음 만들어진 후 없어질 때까지 상태가 변화하며서 각각에 해당하는 메소드가 자동으로 호출되게 됩니다.
onCreate()
-> onStart()
-> onResume()
이후 액티비티가 화면에 보이게 됩니다.
실행된 액티비티에 다른 액티비티가 상위에 오게 되면 onPause()
메서드가 호출되면서 일시 정지가 됩니다.
그 후 다시 실행하게 되면 onResume()
메서드가 호출되어 액티비티를 다시 실행시킵니다.
onStop()
메서드는 중지 상태로 변경 될 때 자동으로 호출되는 메서드입니다.
만약 액티비티가 메모리 상에서 없어질 경우 onDestroy()
메서드가 호출됩니다.
상태 메서드 | 설명 |
---|---|
onCreate() | 액티비티가 처음에 만들어졌을 때 호출 화면에 보이는 뷰들의 일반적인 상태를 설정하는 부분 이전 상태가 저장되어 있는 경우에는 번들 객체를 참조하여 이전 상태 복원 가능 ㅇ이 메서드 다음에는 항상 onStart() 메서드가 호출 |
onStart() | 액티비티가 화면에 보이기 바로 전에 호출 액티비티가 화면 상에 보이면 이 메서드 다음에 onResume() 메서드가 호출 액티비티가 화면에서 가려지게 되면 이 메서드 다음에 onStop() 메서드 호출 |
onResume() | 액티비티가 사용자의 상호 작용하기 바로 전에 호출 |
onRestart() | 액티비티가 중지된 이후에 호출되는 메서드로 다시 시작되기 전에 호출 이 메서드 다음에는 항상 onStart() 메서드가 호출 |
onPause() | 또 다른 액티비티를 시작하려고 할 때 호출 저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행하는 메서드 이 메서드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행하는 메서드 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음 |
onStop() | 액티비티가 사용자에게 더 이상 보이지 않을 때 호출 액티비티가 소멸되거나 또 다른 액티비티가 화면을 가릴 때 호출 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있음 |
onDestroy() | 액티비티가 소멸되어 없어지기 전에 호출 이 메서드는 액티비티가 받는 마지막 호출 액티비티가 어플리케이션에 의해 종료되거나 (finish() 메서드 호출) 시스템이 강제로 종료시키는 경우 호출될 수 있음 액티비티가 이 상태에 들어가면 이 시스템은 액티비티를 강제 종료할 수 있음 |
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()
메서드 안에서 복원해야 합니다.
앱 안에서 간단한 데이터를 저장하거나 복원할 때는 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()
메서드는 현재 입력상자에 입력된 데이터를 저장합니다.
SharedPreferences
를 사용하여 sp문자열을 저장소의 이름으로 사용합니다.SharedPreferences
객체를 사용하려면 getSharedPreferences()
메서드를 참조합니다.SharedPreferences.Edit
객체는 데이터를 저장할 수 있도록 edit()
메서드를 제공하는데 edit()
메서드를 호출한 후 putOOOO()
메서드로 저장하려는 데이터를 설정할 수 있습니다.commit()
메서드를 호출해야 실제로 저장됩니다.restoreState()
메서드는 설정 정보에 저장된 데이터를 가져옵니다.
onSaveInstanceState()
와 onRestoreInstanceState()
메서드도 액티비티의 상태와 관련하여 호출되므로 앞에서 사렾본 코드 대신 사용될 수 있습니다.