반응형

안드로이드 코딩을 하는 도중에 화면 회전 등등 다양한 순간에 activity의 focus를 놓치게 되면 onPause -> onStop -> onDestory가 호출되며 데이터가 유실되는 경우가 있다.

 

이때 데이터를 보존해야하는 것이 있다면 아래와 같이 코딩을 하자.

 

 

MainActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;
    private int mNumber;

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

        mTextView = findViewById(R.id.text_view);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mNumber += 1;
                mTextView.setText(mNumber+"");
            }
        });

        // bundle에 저장되어 있는 데이터 가져오기
       if(savedInstanceState != null)
        {
            mNumber = savedInstanceState.getInt("number");
            mTextView.setText(mNumber+"");
        }
    }

    // onPause 직전에 호출되는 부분, Bundle에 상태를 저장 할 수 있다.
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        outState.putInt("number", mNumber);
    }
 }

 위의 코드와 같이 onPause 직전에 onSaveInstanceState를 호출하게 되는데 이때

저장이 필요한 데이터를 Bundle에 담아주면 된다.

 

다시 onCreate 상태로 돌아올 때 savedInstanceState에 해당 데이터들이 존재하게 된다.

activity_main.java

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">
        <TextView
            android:id="@+id/text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="0"
            android:gravity="center"/>
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="plus"/>
    </LinearLayout>
</LinearLayout>

 

 

 

 

 

 

 

반응형