2011-11-16 3 views
3

내가, BACK을 눌러 다음 때마다 간단한 안녕하세요 응용 프로그램Android에서 종료 한 후 응용 프로그램과 해당 자원이 메모리에 저장되는 이유는 무엇입니까? 나는이 여러 번 실행하면

public class TestLeaksOnFinish extends Activity 
{ 
    static int ctr = 0; 
    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    TextView t = new TextView(this); 
    t.setText("Hello World! "+ctr++); 
    setContentView(t);   
    } 
} 

을 가지고, 나는 클릭률이 활동 후 BACK 완전히 살해되지 않음을 나타내는 각각의 시간을 증가 시킨다는 참조하십시오.

이는 BACK을 누른 후 DDMS에 HPROF 파일을 덤프하여 확인합니다.
이 파일에는 여전히 TestLeaksOnFinish 활동 클래스가 포함되어 있습니다.

BACK을 누른 후이 활동이 여전히 힙 덤프에있는 이유를 설명 할 수 있습니까? 내가 들어오는 참조를 나열 할 때

, 나는 안드로이드 활동에 screenshot from DDMS

+1

뒤로 키를 누르면'finish()'가 호출되고 있습니까? 어쩌면 안드로이드는 응용 프로그램을 일시 중지하고 나중에 다시 시작합니다. 게다가 'ctr'은 정적 인 필드입니다. 누설로 유명합니다. –

+0

정적 프리미티브가 액티비티를 누설하지 않습니다. – FunkTheMonk

+0

@MichellBak finish()가 호출됩니다 (이는 onBackPressed()의 기본 구현이지만 확실하게 무시합니다). onPause 및 onDestroy도 호출됩니다. 또한 더 이상 정적이 아닌 ctr을 만들면 힙 덤프에서 동일한 데이터를 얻게됩니다. 앱을 여러 번 실행하면 ctr 자체가 항상 0으로 표시되어 매번 새로운 인스턴스가 만들어지고 (예상대로) 이전 인스턴스가 더 이상 사용되지 않으므로 메모리에 저장되는 이유가 궁금합니다. –

답변

11

에 따라 얻을 그들은 단지 안드로이드 응용 프로그램을 죽이는 캔트 어떻게 작동하는지 background.That의 이동됩니다 살해 해달라고 또는 기본적으로이 종료 아니에요 너도 알다시피. 그냥 배경과 추억에 남을거야.

메모리가 부족하면 시스템이 모든 응용 프로그램 자체에 부여하는 우선 순위에 따라 응용 프로그램 프로세스가 종료되기 시작합니다.

+0

응용 프로그램에 서비스, 컨텐트 공급자 등이 포함되어있을 때이 일반적인 동작을 이해합니다. 그러나 필자는 필자가 완료 한 단일 활동 만 있었으며 (특히 정적을 제거 할 때) 활동을 더 이상 재사용하지 않습니다 (활동이 재시작 할 때 생성 될 것입니다.) 그래서 힙 덤프가 여전히 내 활동에 대한 참조를 포함하고 있다는 사실에 놀랐습니다. –

+0

그건 안드로이드 시스템이 처음에는 다소 놀라운 소리를내는 방식입니다. 그러나 익숙해지면 실제로 그것이 어떻게되어야 하는지를 알 수 있습니다. –

+0

다음 중 어느 정도 정확합니까? Android에서는 애플리케이션이 활동, 콘텐츠 제공 업체 및 서비스로 구성됩니다. ** ** 활동을 종료 (= 종료()) 할 수는 있지만 전체 응용 프로그램을 종료/종료 할 수는 없습니다. 따라서 마지막 활동이 완료 되더라도 Android는 여전히 응용 프로그램에 대한 참조를 유지합니다. 이 참조는 내 (이미 완료된) 활동입니다. –