티스토리 뷰

몇몇 기기 구성은 프로그램 실행 중에 변경될 수 있다. (예: 화면 방향 전환, 키보드 가용성 및 언어 변경)

이러한 변경이 일어나는 경우 안드로이드는 액티비티를 다시 실행시키게 된다. 쉡게 말하면 수명주기 중에서 destroy가 호출되고 다시 실행되면서 onCreate를 다시 호출하는 것이다.



이 같은 상황을 '특정 구성에 대한 변경'이라 칭하고 정리하겠다.



안드로이드는 특정 구성 변경에 대해 직접 처리 할 수 있는 선택지로 configchanges라는 activity의 속성을 제공한다.



그러나 configchanges의 사용은 시스템이 리소스의 재구성을 도와주지 않기 때문에 특정 구성 변경으로 인한 재시작을 반드시 피해야 하는 경우가 아니라면 사용하지 않는 것이 좋다.



configchanges는 androidManifest.xml 메인 액티비티가 되는 <activity>엘리먼트의 속성으로 android:configchages를 넣어주면 된다. 그리고 이 속성의 값으로 여러가지를 넣을 수 있는데.. | 구분자로 구분해서 여러개 적용이 가능하며, 가장 보편적으로 사용되는 값은 안드로이드 화면의 방향이 변경될 때 다시 시작 하는 것을 방지하는 orientation과 키보드 가용성이 변경될 때 다시 시작을 방지하는 keyboardHidden이 있다.



androidManifest.xml

<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

이를 적용하면 configchanges의 값에 포함되는 구성이 변경 되어도 더이상 MainActivity는 다시 재시작을 하지 않는다.

그 대신, void onConfigurationChanged(Configuration newConfig) 구성 변경 후 이 메서드가 자동으로 호출된다. 즉 이 메서드를 오버라이딩 해야 한다.



이 메서드의 매개 변수 타입인 Configuration은 새 기기 구성을 나타내며 Configuration의 필드를 읽어보면 새 구성을 판별할 수 있고 이를 판단해서 적절한 변경을 취할 수 있다.




다음은 configchanges를 테스트 해보는 코드이다.

방향이 전환이 되면 onConfigurationChanged메서드를 호출하며, 방향이 전환되었다는 토스트 메세지를 보여준다.


androidManifest.xml

        <activity android:name=".FocusActivity" android:configChanges="orientation|screenSize|layoutDirection">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


FocusActivity.java

public class FocusActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_focus); Toast.makeText(this, "onCreate메서드가 호출되었습니다.", Toast.LENGTH_SHORT).show(); final Window win = getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig);

if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ Toast.makeText(this, "가로방향이됨", Toast.LENGTH_SHORT).show(); }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ Toast.makeText(this, "세로방향이됨", Toast.LENGTH_SHORT).show(); } } }


activity_focus.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.choonie.eventapplication.FocusActivity">

    
    <Button
        android:id="@+id/showButton"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:background="@drawable/selector_ex"
        android:textSize="20dp" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/selector_ex"
        android:hint="텍스트를 입력하세요."
        android:textSize="20dp" />


</LinearLayout>


'Android > 정리' 카테고리의 다른 글

SeekBar  (0) 2016.08.04
WebView사용하기 (웹뷰)  (0) 2016.06.14
android selector xml 사용 (뷰를 터치시 색상 효과 주기)  (0) 2016.06.10
이벤트 처리  (0) 2016.06.08
알림 대화상자 띄우기  (0) 2016.05.28
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday