developer tip

활동 수명주기-모든 방향 변경시 onCreate 호출

copycodes 2020. 12. 26. 15:40
반응형

활동 수명주기-모든 방향 변경시 onCreate 호출


.NET에서 비트 맵을로드하는 간단한 활동이 onCreate있습니다. 장치를 회전하면 onCreate다시 호출 된 로그에서 볼 수 있습니다 . 실제로 모든 인스턴스 변수가 다시 기본값으로 설정 되었기 때문에 전체 활동이 다시 인스턴스화되었음을 알고 있습니다.

두 번 회전 한 후 비트 맵에 충분한 메모리를 할당 할 수 없기 때문에 FC를 얻습니다. (액티비티의 모든 인스턴스가 여전히 어딘가에 살아 있습니까? 아니면 GC가 충분히 빨리 정리되지 않습니까?)

@Override
public void onCreate(Bundle savedInstanceState) {
    File externalStorageDir = Environment.getExternalStorageDirectory();
    File picturesDir = new File(externalStorageDir, "DCIM/Camera");
    File[] files = picturesDir.listFiles(new FilenameFilter(){
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".jpg");
        }});
    if (files.length > 0) {
        Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
        ImageView view = (ImageView) findViewById(R.id.photo);
        view.setImageBitmap(bm);
    }
}

내가 읽은 모든 것에서 onCreate는 응용 프로그램의 수명 동안 한 번 호출되어야합니다. 내가 틀렸나 요? 장치 방향을 다시 지정하면 활동이 다시 생성되는 방법은 무엇입니까?


활동은 기본적으로 각 회전 후에 다시 생성됩니다. AndroidManifest configChangesactivity태그 속성 으로이 동작을 재정의 할 수 있습니다 . 자세한 내용과 다른 옵션은 http://developer.android.com/guide/topics/resources/runtime-changes.html을 참조 하십시오.


android:configChanges="keyboardHidden|orientation|screenSize"

주의 : Android 3.2 (API 레벨 13)부터는 기기가 세로 방향과 가로 방향 사이를 전환 할 때 '화면 크기'도 변경됩니다. 따라서 API 레벨 13 이상 (minSdkVersion 및 targetSdkVersion 속성으로 선언 됨)에 대해 개발할 때 방향 변경으로 인해 런타임이 다시 시작되지 않도록하려면 "orientation"값 외에 "screenSize"값을 포함해야합니다. 즉, decalare를 사용해야합니다 android:configChanges="orientation|screenSize". 그러나 애플리케이션이 API 레벨 12 이하를 대상으로하는 경우 활동은 항상이 구성 변경을 자체적으로 처리합니다 (이 구성 변경은 Android 3.2 이상 기기에서 실행되는 경우에도 활동을 다시 시작하지 않음).

http://developer.android.com/guide/topics/resources/runtime-changes.html


방향이 변경되면 어떻게 되나요?

오리엔테이션의 라이프 사이클

onPause();
onSaveInstanceState();
onStop();
onDestroy();

onCreate();
onStart();
onResume();

---- 앱이 다시 만들어져 현재 실행 중입니다 .---

긴 작업을 수행 onCreate()하고 활동을 다시 생성하지 않으 configChanges려면 메인 페스트 속성을 추가 하십시오.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:label="@string/app_name">

api> = 13을 타겟팅하는 경우 screenSize


화면을 회전 할 때의 Actvity 수명주기

onPause
onSaveInstanceState
onStop
onDestroy

onCreate
onStart
onRestoreInstanceState
onResume

FC의 메모리 부족을 방지하려면 onStop()또는 에서 리소스 할당을 해제해야합니다 onPause(). 이렇게하면에서 새 메모리를 사용할 수 있습니다 onCreate().

이것은 다음을 사용하여 활동의 재생을 방지하는 대체 솔루션입니다.

android:configChanges="keyboardHidden|orientation"

때로는 활동의 레이아웃이 세로와 가로 (레이아웃, 레이아웃-랜드)에서 다릅니다. 방향 변경시 재생성을 방지하면 활동이 다른 방향의 레이아웃을 사용하지 못합니다.


On Create 메서드는 방향을 지정할 때마다 호출하므로이를 방지하려면 사용해야합니다.

//Define Below in you Manifest file.
           <activity
                  android:name="com.ecordia.activities.evidence.MediaAttachmentView"
                  android:configChanges="keyboardHidden|orientation|screenSize"
            </activity>

//Define Below in your activity. 

         @Override
            public void onConfigurationChanged(Configuration newConfig) {

              super.onConfigurationChanged(newConfig);

              if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                  //your code
              } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //your code

              }
            }

매력처럼 작동합니다 !!


예, 활동의이 onCreate()(가) 될 때마다 호출 orientation변경 있지만 피할 수 re-creation의를 Activity추가하여 configChanges attributeActivity여러분의 AndroidManifest활동 태그에 파일.

android:configChanges="keyboardHidden|orientation"

오리엔테이션 변경을 처리하기 위해 가장 일반적이고 제안 된 "솔루션"중 하나는 처리하지 않는 것입니다. 아래와 같이 AndroidManifest.xml의 활동에 android : configChanges 플래그를 설정하여이를 수행 할 수 있습니다.

<activity
    android:name=".MyActivity"
    android:label="@string/title_my_activity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

이것은 방향 변경을 처리하는 올바른 방법이 아닙니다.

올바른 방법은 onSaveInstanceState 메서드를 구현하고 (이것은 Activity, Fragment 또는 둘 다에있을 수 있음) 메서드에 전달되는 Bundle 인수에 저장해야하는 값을 배치하는 것입니다.

It is nicely described here: http://code.hootsuite.com/orientation-changes-on-android/

While it may seem a bit tedious to implement, handling orientation changes properly provides you with several benefits: you will be able to easily use alternate layouts in portrait and landscape orientations, and you will be able to handle many exceptional states such as low memory situations and interruptions from incoming phone calls without any extra code.


Manifest XML activity Tag:

android:configChanges="keyboardHidden|orientation"‍‍‍


@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
}

Use the above code to perform changes related to orientation in your Activity Java Code

Cheers!!!


Kindly see my way of doing it:-

http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

snippet is:-

@Override
protected void onSaveInstanceState(Bundle b) {
    super.onSaveInstanceState(b);
    String str="Screen Change="+String.valueOf(screenChange)+"....";
    Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
    screenChange=true;
}

@Override
public void onCreate(Bundle b) {
    super.onCreate(b);
    ctx=getApplicationContext();
    if(!screenChange) {
         String str="Screen Change="+String.valueOf(screenChange);
         // ...
    }
}

While the Manifest way may work, there is a better and proper solution for these types of problems. The ViewModel class. You should have a look here: https://developer.android.com/topic/libraries/architecture/viewmodel

Basically, you extend the ViewModel class and define all the data members in it which we want to be unchanged over re creation of the activity (in this case orientation change). And provide relevant methods to access those from the Activity class. So when the Activity is re created, the ViewModel object is still there, and so are our data!


I had the same problem, in which my onCreate is called multiple times when the screen orientation is changed. My problem got solved when i add android:configChanges="orientation|keyboardHidden|screenSize" in the activity tag in manifest


I had the same problem and I did some workaround

Define didLoad boolean variable with false value

private boolean didLoad = false;

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

    if (!this.didLoad){
        // Your code...
        this.didLoad = true;
    }

ReferenceURL : https://stackoverflow.com/questions/7618703/activity-lifecycle-oncreate-called-on-every-re-orientation

반응형