본문 바로가기

안드로이드

라이프사이클

반응형
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko

https://codechacha.com/ko/android-shared-preferences/

 

 

 

MainActivity

package com.example.a27_samplelifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        System.out.println("main : onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("main : onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("main : onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("main : onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("main : onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("main : onResume");
    }


}

 

 

 

화면에 보일 때는 onCreate, onStart, onResume 순서로 호출되고, 시스템 [back] 버튼을 눌러 화면을 없앨 때는 onPause, onStop, onDestroy 순서로 호출된다

 

화면이 전환될 때는 onDestroy가 호출 되지 않는다

서브 액티비티가 화면에 보이는 시점에 메인 액티비티는 화면 뒤쪽에 숨어있는 것과 같은 상태가 되고(실제로는 액티비티 스택으로 들어감), 서브 액티비티가 사라지면 다시 onResume 메소드가 호출되면서 화면에 보이게 된다

 

onResume과 onPause는 화면이 보일 때와 화면이 보이지 않을 때 항상 호출된다

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

게임을 할 때 사용자의 점수가 갑자기 사라지지 않도록 하려면 onPause 메소드 안에서 데이터를 저장하고 onResume 메소드 안에서 복원해야 한다

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/nameInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="152dp"
        android:ems="10"
        android:hint="name"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

MainActivity

package com.example.a27_samplelifecycle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

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

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);

        System.out.println("main : onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("main : onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("main : onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("main : onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("main : onPause");

        saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("main : onResume");

        restoreState();
    }

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

//            2번째 인자는 기본 값으로, key에 대한 데이터가 없을 때 이 값이 리턴
            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();
    }
}

 

반응형

'안드로이드' 카테고리의 다른 글

한 화면에 2개의 프래그먼트  (0) 2021.10.19
프래그먼트  (0) 2021.10.18
태스크 관리  (0) 2021.10.14
Paracelable 다른 참고 자료  (0) 2021.10.14
데이터 전달, Parcelable  (0) 2021.10.14