2012-10-30 2 views
0

나는 TestActivity을가집니다. 이 활동은 Button 언론의 주요 활동에서 시작됩니다. 내 테스트 활동이 매니페스트 파일에 선언 된 방법입니다. 오리 엔테이션 활동 인스턴스 카운트 증가의 결과 변경

<activity 
     android:name="com.example.MyTestActivity" 
     android:configChanges="keyboard|keyboardHidden" 
     android:label="MYTESTACtivity" 
     android:theme="@style/someTheme" 
     android:windowSoftInputMode="stateHidden|adjustPan" > 
    </activity> 

이제 TestActivity 화면이 표시되면 내가 방향 변경을 할 경우, 다음 TestActivity의 인스턴스 카운트가 1 씩 증가하는 것은 내가 다시 세로 모드로 변경하면 문제는 그것으로 증가하고있다 1 더. 오리엔테이션 변경 중에 인스턴스 수를 계속 올리는 방법입니다.

방향 변경 사항에 상관없이 한 번에 하나의 활동 인스턴스 만 작성하는 방법에 대해 조언하십시오. 나는 또한 동일한 문제가 존재하는 android:launchMode="SingleTop"를 추가하려고 시도했습니다. FYI, 엄격한 모드로 인스턴스 카운트를 찾을 수있는 방법입니다. 화면 방향 (사용자가 장치를 회전 한) 실행시에 변경 될 때 디폴트

01-02 01:39:48.855: E/StrictMode(21992): android.os.StrictMode$InstanceCountViolation: class com.example.MyTestActivity; instances=20; limit=1 
+0

android : launchMode = "singleInstance" – Ajay

+0

android : singleInstance는 사용하지 않는 것이 좋습니다. 따라서 사용할 수도 없습니다. – Guna

+0

컨텍스트 누출이 있습니까? 가비지 수집중인 활동의 이전 인스턴스를 방해하는 응용 프로그램의 다른 곳에서 활동의 내용에 대한 참조를 보유하고있을 가능성이 있습니다. – Simon

답변

0

onCreate() 호출이 필요합니다. 오리엔테이션을 변경할 때마다 활동이 파괴 된 다음 다시 작성되어 onCreate()가 호출됩니다. 그러나 기존 인스턴스가 파손되지 않고 누수라는 원인을 알 수있는 유일한 것입니다. 일반적인 원인은 활동이 파괴 될 때 비트 맵을 바인드 해제하지 않는 것입니다.

+0

또한 Simon의 답변에 추가하려면 Strict Mode 코드에 문제가 있다고 생각합니다. 내 Activity의 onDestroy()에서 System.gc()를 호출하고 동일한 유스 케이스를 다시 실행합니다. 이제는 최대 카운트가 6이나 되려고했는데, 엄격한 모드로 표시된 활동 횟수가 조금이라도 주어지면 로그가 2로 떨어지는 경우에도 우리는 Activity에서 System.gc()를 호출 할 필요가 없다는 것을 알았지 만 이것이 내 활동에서 실제로 메모리 누수인지 확인하려고 시도했습니다. Strict 모드와 같이 더 약한 참조가 활동이 있지만 일단 가비지 콜렉터 작업이 완료되면 엄격 모드는 실제 활동 계수를 올바르게 표시합니다. – Guna

-2

은 활동 종료하고 다시 시작된다. 이를 매니페스트에 추가하는 것을 방지하십시오. 다음과 같은

android:configChanges="keyboardHidden|orientation"

그래서 매니페스트 의지가 보인다.

<activity 
    android:name="com.example.MyTestActivity" 
    android:configChanges="keyboard|keyboardHidden|orientation" 
    ...../> 

귀하의 활동 방향에 chenges 동안 다시 시작되지 않습니다 :

<activity 
    android:name="com.example.MyTestActivity" 
    android:configChanges="keyboard|keyboardHidden" 
    android:label="MYTESTACtivity" 
    android:theme="@style/someTheme" 
    android:windowSoftInputMode="stateHidden|adjustPan" 
    android:configChanges="keyboardHidden|orientation"> 
</activity> 

더 많은 정보를 위해이 추가 this

+0

해당 링크를 읽었는지 확인하십시오. 많은 사람들은 android : configChanges = "keyboardHidden | orientation"이 무엇을하는지 이해하지 못하는 해결책이라고 생각합니다. 활동주기를 배우기 (http://developer.android.com/guide/components/activities.html), 앱이 어떻게 처리해야하는지 생각하면 올바른 접근법입니다. – Simon

+0

가로 모드에서 표시해야하는 별도의 레이아웃 변경 사항이 있으므로이 Android 배치를 할 수 없습니다. configChanges : orientation | screensize 키워드를 내 앱에 넣으십시오. 감사합니다. – Guna

-3

시도를 확인합니다.

+0

이것은 정확히 20 개의 인스턴스가 실행 중일 때 원하지 않는 일입니다. 분명한 누출이 있으며 처리해야합니다. 이를 처리하지 않으면 응용 프로그램이 현재 사용되지 않을 때 필요한 것보다 많은 자원을 사용하고 최종 사용자에게는 매우 나쁜 결과가됩니다. – JRomero

0
내가이 게시물을 찾는 다른 이민자가 더 생각이없는 솔루션으로 이것을 받아 들일 수 있으리라는 희망에서, 대답에 내 의견을 이동하고 확장하기로 결정

:

안드로이드 : configChanges : 방향을 | 화면 크기 :

Android는 구성 변경에 따른 활동을 파괴하고 다시 만들도록 설계되었습니다. "내가하고있는 일을 이해하고있다. 안드로이드가 디자인 된 방식대로 행동하기를 원하지 않으며 모든 결과를 다룰 것이다. 나는 모든 결과를 다룰 것이며, 나는 모든 결과를 다룰 것이다"라고 말하고있다.

상황이 올바른 해결책이지만, 대부분의 상황에서 잘못된 것이고 "내 문제가 해결되었습니다"라는 것부터 멀쩡합니다. 사실 안드로이드가 자동으로 수행 할 작업을 수행하기 위해 더 많은 코드를 작성해야하므로 실제로 문제가 시작된 것입니다. 더 많은 코드 = 더 많은 버그 = 유지 관리 가능성 감소

OP는 정확한 대답을 제공 할만큼 자세한 내용을 제공하지는 않지만 일반적으로 정답은 활동 라이프 사이클 (예 : Android가 작동하도록 설계된 방법)에 대해 배우고 앱에 적용되는 방법과 다양한 콜백을 처리하는 방법 . 특히 onCreate(), onStart() 및 onResume()과 onPause() 및 onStop() 사이의 차이점을 이해하는 것이 중요합니다. 예를 들어, onCreate()에 많은 코드를 넣는 것은 초보자가 흔히 범하는 실수입니다. onCreate()에서 수행 한 중요한 코드가 거의 모두있는 앱을 보았습니다. 개발자는 처음으로 홈 버튼을 누른 다음 앱으로 돌아가서 제대로 작동하지 않는 이유에 대해 궁금해합니다.

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

는 Yddl 여기에 좋은 설명을 제공 : 당신이 찬성 투표하려면 내가했던 모든 그의 응답을 참조 그대로

Why not use always android:configChanges="keyboardHidden|orientation"?

, 다음 그를 upvote에.

관련 문제