2013-07-19 3 views
1

내 응용 프로그램에서 메모리 사용을 최소화하기 위해 노력하고있어 내가하고있는 일 중 하나는 onPause 메서드에서 finish()를 호출하는 것입니다. 대부분의 경우 잘 작동하는 것으로 보이지만 사용자가 다음 활동에서 뒤로 버튼을 클릭하면 논리적으로 완료된 활동을 건너 뛰고 더 뒤로 이동합니다. 백 스택에서 해당 액티비티를 가질 수 있으며 사용자가 다시 누르면 다시 생성됩니까?onPause 활동을 완료했지만 여전히 백 스택에 있습니까?

+0

왜 정말로 필요합니까? 'OutOfMemoryError'에 문제가 있습니까? '활동'만으로도 기껏해야 수 킬로바이트의 메모리를 차지합니다. –

답변

2

아니요.이 결론은 the task and backstack documentationactivity documentation뿐 아니라 stack data structure의 작동 방식에 대한 일반적인 이해에서 비롯됩니다.

스택 데이터 구조는 푸시/풋 (push/put)과 콜렉션에 무언가를 추가하는 두 가지 조작 만 가능합니다. Stacks folow는 LIFO에서 마지막으로 추가 된 것 (당신의 경우 활동)이 팝이 호출 될 때 제거되는 첫 번째 모델입니다.

안드로이드 라이프 사이클 활동은 일반적으로 뒤로 버튼을 누르면 스택에서 팝됩니다. 그 시점에서 onDestroy()이 호출되고 활동이 제거됩니다 (확인하려면 onDestroy() 메서드를 무시하고 결과를 로깅하여이를 확인할 수 있습니다). 또는 finish()을 그대로 호출하여 onDestroy()을 호출하도록 할 수 있습니다. 활동을 끝내는 것은 효과적으로 뒤로 누름과 똑같은 일을합니다. 액티비티는 파괴되어 스택에 추가되기 전에 재 작성해야합니다.

스택을 수행하려는 경우 활동이 존재하지 않지만 참조와 비슷한 무언가가 유지되는 중간 상태를 통합해야합니다. 상단으로 이동하면 해당하는 활동을 재현해야합니다. 이것은 자루가 작동하는 방식이 아니기 때문에 (즉, 활동 만 수행 할 수 있음) 상태가 존재할 수 없으므로 사용자가 말하는 결과는 불가능합니다.

1

아니요, 가능하지 않다고 생각합니다. 일단 활동을 끝내면 사라집니다. 그러나 스택을 구현하고 처리 할 수는 있습니다. 다시 누르면 닫힌 활동을 다시 시작합니다.

+0

동의 - 당신은 활동이 추가 된 원래의 순서를 유지할 수있는 자신 만의 구조를 만들 수 있었고, 의도를 통해 이전에 파괴 된 것들을 다시 만들 수있었습니다. – Rarw

+0

문제는 정확한 활동 상태를 다시 만드는 것입니다. 예 : 사용자가 EditText에 텍스트를 입력 한 경우이 활동으로 돌아 왔을 때이 텍스트가 사라지지 않게 할 수 있습니다. – SimonSays

+0

savedInstaceState 또는 SharedPreferences를 사용하여이 작업을 수행 할 수 있습니까? – Rarw

2

당신의 목표는 (필요한 경우) 그냥 에서 onCreate() 방법을 비워 둘 - 그냥 활동 수명주기의 사용은 당신이 다른 작업을 수행 할 수 있습니다

을, 메모리를 사용을 최소화 이다. (setContentView (layout) 만 수행)

-Override onResume();

- onCreate에서 수행 한 작업은 onResume()에 붙여 넣기 만 복사하면됩니다.

- 그리고 에서

onPause(), 재활용 당신의 모든 비트 맵 및 null로 설정은 (난 당신이 그것에 대해 매우 신중 왜 그게 비트 맵을 사용하는 생각). 은 내 전망을 삭제합니다.

이제 새로운 활동을 시작할 때 onPause()이 호출됩니다. 그러면 모든 비트 맵 및보기가 제거됩니다. 그리고 돌아올 때 onResume()이 호출됩니다 (onCreate는 호출되지 않습니다). 그러면 뷰와 비트 맵이 다시 초기화됩니다.

+0

모든 ImageViews를 null로해야합니까? 또는 ImageViews가 비트 맵을 자동으로 재활용합니까? – StackOverflowed

+0

이미지보기는 비트 맵을 재활용하지 않습니다. bitmap.recycle()으로 비트 맵을 재활용해야합니다. –

관련 문제