2011-12-05 3 views
1

Android 기기를 순환 (구성이 변경되는 경우) 할 때 어떤 방법이 우선 적용되는지 알고 싶습니다.Android 구성이 변경됨

onSaveInstanceState(...), onConfigurationChanged(...), onRestoreInstanceState(...) - 이와 비슷한?

구성 변경과 관련된 전체 프로세스를 청취하는 것도 재미있을 것입니다. 감사. 안드로이드 개발자

답변

3

하는 모든 변수가 될 것입니다 다시 이상 예를 찾을 수 있습니다 더 많은 정보 Retaining an Object During a Configuration Change 여기에서

봐 초기화 됨. 따라서이 경우 Rotation에서 일부 값을 동일하게 유지하려면 onSaveInstanceState()을 사용하여 상태를 저장할 수 있으며 Bundle is null을 선택하여 onCreate()으로 다시 복원 할 수 있습니다. (이 단지는 구성을 선택한 경우 매니페스트에 configChanges 속성으로 처리하고 싶은 호출 할 것이다 주) 장치를 회전 할 때 로 호출됩니다

if(savedInstanceState != null){ // get the restore value from the Bundle } 

. 매개 변수에서 새 장치 구성을 가져옵니다.

Device 순환시 활동을 다시 생성하지 않으려면이 줄을 AndroidManifest 파일의 활동 태그에 추가해야합니다.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 

더 자세한 정보는 아래를 참조하십시오 : 여기 http://developer.android.com/guide/topics/manifest/activity-element.html#config

수행 할 수 있습니다 http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

당신이 보는에 관심이있을 수

android:ConfigChanges="keyboardHidden|orientation" 
+0

나는 이것에 문제가있다. 두 가지 레이아웃이 있습니다. 하나는 가로보기 용이고 다른 하나는 세로보기 용입니다. 텍스트보기가 있습니다. 그리고 회전시 입력 된 텍스트를 잃지 않으려합니다. 이 순간에 나는 onConfigurationChanged를 사용했습니다. 기본적으로 onCreate와 동일한 직원이 있습니다. 문제는 onConfigurationChanged에서 Bundle이없고 입력 한 텍스트를 저장/검색 할 수 없다는 것입니다. onSaveInstanceState() 및 onConfigurationChanged()를 사용하면 첫 번째 매개 변수는 아무런 영향을주지 않습니다. 이 문제를 해결하는 방법을 모르겠습니다 ... – lomza

+0

onCreate()에서 번들 값을 검색하여 더 많이 사용합니다. –

+0

실수를 이해했으며 configChanges를 사용할 필요가 없었습니다. onSaveInstanceState 및 onRestoreInstanceState를 재정의하기 만하면되었습니다. 거기에서 텍스트 뷰를 저장/검색 할 수 있습니다. 레이아웃 구성 처리가 자동으로 수행되므로 다른 작업을 수행 할 필요가 없습니다. onConfigurationChanged가 모든 것을 오버라이드하고 있으므로 복잡한 논리는 필요하지 않습니다. – lomza

2

...

는 런타임 구성 변경시 객체를 유지하려면 :

  1. 재정이 유지하고자하는 객체를 반환하는 onRetainNonConfigurationInstance() 방법.
  2. 활동이 다시 생성되면 getLastNonConfigurationInstance()으로 전화하여 개체를 복구하십시오.

안드로이드 인해 구성 변경을 중지시() 및들의 OnDestroy()은 액티비티를 종료 할 때 사이 onRetainNonConfigurationInstance()를 호출합니다. onRetainNonConfigurationInstance()를 구현할 때 구성 변경 후 상태를 효율적으로 복원하기 위해 필요한 모든 Object를 반환 할 수 있습니다.

이 시나리오가 유용 할 수있는 시나리오는 응용 프로그램이 웹에서 많은 양의 데이터를로드하는 경우입니다. 사용자가 장치의 방향을 변경하고 작업이 다시 시작되면 응용 프로그램이 데이터를 다시 가져와야하므로 느려질 수 있습니다. 대신 수행 할 수있는 것은 onRetainNonConfigurationInstance()을 구현하여 데이터를 전달하는 객체를 반환 한 다음 활동이 getLastNonConfigurationInstance()으로 다시 시작될 때 데이터를 검색하는 것입니다. 당신은 또한 당신이 당신의 활동이 다시 만듭니다 장치를 회전 할 때 ..

감사합니다 ..

+0

덕분에이 코드를 복사하여 붙여 넣습니다. 유용한 정보;) – lomza

4

는 안드로이드 개발자 기준에 따르면 당신은 사용해야합니다 들을 수있는 모든 구성 수신기를 찾으십시오.

안드로이드 매니페스트에 넣어하는 것을 잊지 마십시오 :

+0

"런타임 변경 처리"링크를 가져 주셔서 감사합니다. 현재 onConfigurationChanged를 사용하고 있습니다. – lomza

+0

이 답변은 저를 도왔습니다 .. 그러나'android : configChanges'의 어떤 형태로 매니페스트를 업데이트하는 부분 .. 바닥에 있기 때문에 나는 그것을 놓쳤습니다. 그리고 나는 겸손한 화면 크기에 있습니다. 엄청난 문제는 아니지만 Java 코드 근처에이 코드를 사용하는 것이 도움이 될 수 있습니다. 해당 메서드에서 중단 점을 설정했지만 매니페스트 업데이트가 필요할 때까지 트리거되지 않았습니다. 어느 쪽이라도.. 나를 바른 방향으로 가게하기위한 감사합니다! – gnB

0

이동 매니페스트 및 추가 ...

<activity 
    android:configChanges=["orientation"] 
    . . . 
</activity> 

희망이 도움이 : 안드로이드 : configChanges = "오리엔테이션 | 화면 크기"

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

주 AC tivity :

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 


    } 

모두 완료 -