2013-08-07 1 views
15

처럼 : finish() explicitly, onDestroy()를 호출하지 않고Android에서 새 활동을 시작한 후에 finish()를 호출하는 것이 좋습니다.

startActivity(intent); 
finish(); 

이 전 활동에 대해 호출되지 않으며, 내가 (OutOfMemory Exception).

그래서 메모리가 부족은 finish() explicitly to prevent OutOfMemory Exception?

+0

다시 버튼을 클릭하여 이전 활동으로 돌아가려면 어떻게해야합니까? – Raghunandan

+2

아니요. 문제가 다른 곳에서 발생했습니다. – fdreger

+0

어디서나'Bitmap' (또는 컬렉션)을 사용하고 있습니까? [mat memory analyzer tool] (http://www.eclipse.org/mat/)을 아직 사용하지 않았다면, 이제는 좋은 시간입니다. – haventchecked

답변

1

이가 이렇게 전화하는 것이 좋습니다 그 것이다 괜찮으 시다면 Activity의 인스턴스가 필요하지 않습니다. 그래서 당신이 다음에 Activity을 다시 누르면이 것에 돌아 가지 않을 것이라는 것을 알게됩니다. 그러나 그 이상인 스택이 있다면 그 Activity이있는 곳이나 홈 화면이 없습니다.

그러나 여기에 OOM 예외가 발생하는 이유는 확실하지 않으므로 대신 어디에서 오는 것인지 알아야합니다. Bitmap을 사용하는 경우 예외가 발생할 수 있습니다.

+0

예, 저는 비트 맵을 사용합니다. 명시 적으로 finish()를 호출하지 않으면 GC가 Activity의 onDestroy()를 호출하지 않고 Activity의로드 된 Bitmap 리소스가 많은 메모리를 차지하므로 결국 outOfMemoryException이 발생합니다. GC에서 onDestroy()를 호출하지 않으면 메모리 누수가 발생합니까? Activity에 대한 참조가 없으면 더 많은 메모리가 필요할 때 GC가 ondestroy()를 호출하지 않아야합니까? –

0

startActivity이 Android 가이드 라인을 따르지 않아서 finish()을 호출하지 않습니다. OutOfMemoryExecption이 다른 원인으로 인해 발생했습니다.

+13

가이드 라인에서'startActivity'를 호출 한 후에'finish()'를 호출해서는 안된다고 말하는가? –

+2

아래의 의견을 읽은 후 가이드 라인을 잘못 해석 한 것으로 보입니다. 내 실수. –

25

새 작업을 시작하면 현재 작업이 현재 작업의 백 스택으로 푸시됩니다. (플래그 및/또는 매니페스트를 통해이 동작을 변경할 수 있지만 이것이 기본 동작입니다.) 사용자가 back 함수를 누르면 맨 위 활동이 완료되고 스택이 팝됩니다. 결과적으로 사용자는 앱이 이전 활동으로 돌아가는 것을 확인합니다.

새로운 활동을 시작한 후에는 finish()으로 전화해도됩니다. 결과는 현재 활동 (방금 스택을 시작하기 때문에 더 이상 스택의 맨 위에 있지 않음)이 스택에서 제거된다는 것입니다. 그런 다음 사용자가 뒤로를 누르면 뒤로 스택의 이전 활동으로 이동하거나 스택이 비어있는 경우 앱을 종료합니다.

활성 A와 B를 항상 새로 시작하여 finish()을 호출하지 않고 앞뒤로 튀는 경우 스택이 각 활동의 인스턴스로 채워 지므로 OOM 예외가 발생할 수 있습니다.

자세한 내용은 가이드 항목 Tasks and Back Stack에서 확인할 수 있습니다. 또한 활동 간 순환을 올바르게 처리하는 방법을 설명합니다.

+0

좋은 답변입니다. 고맙습니다. – stevehs17

+0

'startActivity (인 텐트); finish();'이 두 문장 모두 중요합니까? –

+1

@WeishiZeng - 두 가지 방법으로 모두 해봤지만 아무런 차이가없는 것 같습니다. 나는 그것이 중요하다고 생각하지 않는다. –