Android Studio 시작하기(2편)

Posted by ITPangPang
2016. 4. 13. 02:17 안드로이드(android)/시작부터



Android Studio 시작하기(2편)



public class MainActivity extends Activity

protected void onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

 

 



Android Studio 시작하기


@Override protected void onCreate(Bundle savedInstanceState) 

}

 

안드로이드 레퍼런스를 찾아보면

 

Activity Class에서 설명하기를

 

onCreate메서드는 Activity가 실행될때 호출된다고 합니다.

 

 

이처럼 Activity의 상태가 변경될때마다 호출되는 메서드들이 있습니다.

 

이러한 메서드들을 Activity 생명주기(LifeCycle) 메서드라고 합니다.

 

onCreate가 이 생명주기 메서드중 하나입니다.

 

 

Activity 생명주기

앱을 사용할때 사용자 눈 보이는 화면이 Activity입니다.

 

앱 하나에 1개의 Activity가 존재할 수 있고,

 

50개의 Activity가 존재할 수도 있습니다.

 

 

각각의 Activity에는 생명주기라는 것이 있습니다.

 

말 그대로 Life = Activity의 삶이라는 것입니다.

 

 

앱을 사용하다보면 전화가 올 수도 있고, 전원이 꺼질수도 있고,

 

다른 화면으로 넘길수도 있고, 홈버튼을 누를수도 있고 기타 등등

 

여러 상황에서 해당 Activity는 단순하게 사용자의 눈에서 안보입니다.

 

하지만 전화를 끊거나, 해당 Activity를 다시 실행시키거나 하면

 

다시 아무일 없다는 듯이 사용자의 눈에 Activity가 다시 보이게 됩니다.

 

 

이러한 상태변화의 과정 속에서 생명주기 메서드들이 호출되고,

 

호출 됬을때 어떻게 처리를 잘하느냐에 따라 앱의 완성도가 달라지게 됩니다.

 

 

그럼, 생명주기 메서드들의 종류를 알아보고

 

어떤 경우에 호출되는지 간단하게 알아보겠습니다.

 

 

① onCreate() : 액티비티가 최초 생성될때 호출되는 메서드(초기화 작업이 진행)

 

② onStart() : onCreate(), onRestart()(바로 밑에서 설명)가 호출된 후 바로 호출되는 메서드.

                  (액티비티가 실행되고, 사용자 눈에 보이는 시점입니다)

 

③ onRestart() : 액티비티가 중단되었다가 재시작될때 호출되는 메서드

                   

④ onResume() : 사용자와 상호작용하는 메서드

 

⑤ onPause() : 다른 액티비티가 실행될때 호출되는 메서드

 

⑥ onStop() : 액티비티가 더이상 사용자 눈에 보이지 않을때 호출되는 메서드

 

⑦ onDestroy() : 액티비티가 소멸될 때 호출되는 메서드

 

 

지금은 onCreate만 집중적으로 보면 되므로

 

다른 생명주기 메서드들은 어떤 종류가 있는지만 간단히 적어보았습니다.

 

이후에 다른 예제나 실습을 통하여 각각의 메서드들은 직접 사용해보면서

 

집중적으로 알아보겠습니다.

 

 

onCreate는 매개변수로 Bundle SavedInstanceState를 받습니다

 

onCreate(Bundle SavedInstatnceState) 위와 합쳐서 말해보자면

 

액티비티가 실행될때 onCreate가 호출되면서 Bundle객체를 전달받습니다.

 

 

그렇다면 Bundle이란 무엇일까요?

 

결론부터 말하면 "주 역할은 동적상태의 데이터를 저장하고 복원하는 클래스" 입니다.

 

조금 더 정확한 정의를 얻기 위해서는

 

레퍼런스에서 Bundle Class, Parcelable Interface를 검색해서 찾아보시면 됩니다.

 

말로만 설명하면 이해하기 힘드니 직접 테스트를 통해서 알아보겠습니다.

 

 

프로젝트 생성후에 바로 Log만 달아서 savedInstanceState에 저장되는 값을 

확인해보겠습니다. 

public class MainActivity extends Activity
{

    final static String TAG = "hoit";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG,"savedInstanceState:"+savedInstanceState);

    }
}

 


 

프로젝트 생성후에 savedInstanceState에는 null값으로 아무것도 저장되어있지 않았습니다.

 

그렇다면 어떤 경우에 값이 들어올까요?

 

참조문서를 확인해보겠습니다.

 

확인을 해보니 액비티비가 shut down 후에 다시 초기화 될 때 입니다.

 

Note부분을 보니 다른 경우에는 null값이라 적혀있습니다.

 

왜 위에서 null값이 나왔는지 이해가 됩니다.

 

 

shut down이 어떤 예기치 못한 문제로 앱이 중단되었을때라고 해석해보자면

 

메모리부족등으로 앱이 강제종료되었을때를 의미하는 것 같습니다.

 

 

한가지 예를 들면,

 

스마트폰을 사용하다보면 한가지 앱만 사용하는 것이 아니라

 

여러앱을 동시에 사용하는 경우가 있습니다. 이럴경우 처음에 사용한 앱들은

 

우선순위가 밀려나면서 메모리 부족현상등이 일어났을때 가장 먼저 강제종료되는

 

대상이 됩니다.

 

 

 

어쨋든 강제종료됬을때 어떤식으로 savedInstanceState에 값이 들어오는지 확인해보겠습니다.

 

savedInstanceState에 값이 저장될때는 메모리부족 외에도 화면을 가로,세로 전환할때도

 

포함됩니다. 테스트를 위해서 가로 세로 화면 전환을 하면서 값을 확인해보겠습니다.

 

 

먼저 위에 null값이 떨어진 그 상태에서 화면만 가로로 전환해보겠습니다.

 

 

화면전환을 하니 savedInstanceState에 값이 들어왔습니다.

 

슬쩍 보니 자세히는 모르겠지만 화면포커스 같은것들이 저장된 것 같습니다.

 

이렇게 써보니 뭔가 저장되는거 같은데 어떻게 활용해야 할지는 아직 잘 모르겠습니다.

 

 

 

조금더 이해하기 쉽도록 EditText에 값을 입력해서 TextView에 출력하는 경우를 보겠습니다

아래그림은 EditText에 123456789를 입력한 후 버튼을 누르면

 

위에 TextView에 그대로 출력되는 화면입니다.

 

 

 

위에 상태에서 화면만 가로로 눕혀보겠습니다.



가로로 눕히니 savedInstance에 값이 들어오는것이 먼저 확인됩니다.

 

그리고 또 하나더 123456789가 찍혀있던 TextView에 값이 사라지고

 

초기값 Text인 Hello world!가 찍혀있는것을 볼 수 있습니다.

 

지금은 테스트용으로 간단하게 입력하였지만, 실제로 엄청난 데이터가 입력되있을때

 

화면전환이나 강제종료로 모두 날라가 버린다면 최악의 앱일 것입니다.

 

 

이를 해결하기 위해서

 

① onSaveInstanceState(Bundle outState)

 

② onRestoreInstanceState(Bundle savedInstanceState)

 

위 두가지 메서드를 통해서 강제종료나 화면전환시 데이터를 저장하고

 

복원하는 작업을 할 수 있습니다.

 

 

사용방법은 putCharSequence, getCharSequence를 통하여 키와 값을 Bundle에 저장하고

 

다시 키값을 찾아서 복원시키면 됩니다.

 

 

좀 더 자세히 아시려면 참조문서에서

 

onSaveInstance(), onRestoreInstanceState() 메서드는 Activity Class에서

 

put(get)CharSequence() 메서드는 Bundle Class에서 검색하시면 공부하실수 있습니다.   

 

 

화면전환시에도 TextView에 저장된 Text를 보존하는 방법입니다.

(로그캣으로 생명주기메서드와 위 2개의 메서드 호출과정을 보겠습니다)

public class MainActivity extends Activity
{
    TextView tv = null;
    TextView tv1 = null;
    Button btn = null;
    EditText et = null;
    static final String TAG = "hoit";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);

        tv = (TextView)findViewById(R.id.tv);
        tv1 = (TextView)findViewById(R.id.tv1);
        btn = (Button)findViewById(R.id.btn);
        et = (EditText)findViewById(R.id.et);

        tv.setText("savedInstatnce :" + savedInstanceState);

        btn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                tv1.setText("" + et.getText().toString());
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
        CharSequence Text = et.getText();
        outState.putCharSequence("Text1", Text);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState");
        CharSequence Text = savedInstanceState.getCharSequence("Text1");
        tv1.setText(Text);
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        Log.d(TAG, "onResume");
    }


    @Override
    protected void onPause()
    {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        Log.d(TAG, "onDestory");
    }
}

 

 

앱 실행 후 EditText에 123456789 입력 후 버튼을 눌러서 TextView에 그대로 출력후

화면을 가로로 눕혔을때 입니다.

 

아까와는 다르게 가로로 눕혀도 TextView에 123456789가 그대로 보존되는 것을

 

확인 할 수 있습니다.

 

한가지 더 savedInstance(화면엔 오타가..)에 Key로 저장했던 Text1과 123456789가

추가되어서 값을 가지고 있는 것을 확인 할 수 있습니다.

 

로그를 확인하면

화면전환시에 onPause()가 호출된 후에 onSaveInstanceState()가 호출되고,

 

다시 onCreate()를 통해서 재초기화 작업이 진행 된후에, onResume() 메서드 전에

 

onRestoreInstanState()가 호출되어서 복원하는 것을 확인 할 수 있습니다.

 

 

이 정도에서 protected void onCreate(Bundle savedInstanceState)에 관해서는 마치겠습니다.

 

도움사이트 : http://developer.android.com/intl/ko/reference/android/os/Bundle.html

도움사이트 : http://developer.android.com/intl/ko/reference/android/app/Activity.html


 

 

'안드로이드(android) > 시작부터' 카테고리의 다른 글

Android Studio 시작하기(1편)  (0) 2016.04.13