2011-01-24 5 views
29

나는 시작할 때 인터넷에서 이미지를로드하는 Activity를 얻었습니다. 메모리를 절약하기 위해 뒤로 버튼을 눌러 Activity를 남겨두면 모든 데이터를 덤프 할 수 있습니다. 즉, 모든 문자열과 이미지가 제거됩니다. 이 일을하는 가장 좋은 방법은 활동을 죽이는 것이라고 생각했습니다.뒤로 버튼을 누르면 어떻게 활동을 종료합니까?

글쎄, 뒤로 단추를 눌렀을 때의 콜백을 알아낼 수 없습니다. 그래서, 작업에 대한 onPause()onStop() 콜백을 사용하려고 시도했지만 두 가지 방법 모두 내 응용 프로그램을 강제 종료합니다. 코드는 다음과 같습니다.

public void onPause() { 
    this.finish(); 
} 
public void onStop() { 
    finish(); 
} 

여러 가지 변형을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. 어떤 아이디어?

+0

정확히 무엇을 찾고 계십니까? 뒤에서 현재 활동을 마치시겠습니까? –

답변

36

응용 프로그램 라이프 사이클이 here을 작동하는 방법의 구조를 연구하는 경우

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

무엇이 요점입니까? 뒤로 버튼을 누르면 자동으로 액티비티 스택 아래로 이동합니다. 'finish()'는 당신이 돌아갈 수 없도록합니다. (즉,이 질문은 분명히 모호합니다.) 물론 – EboMike

+2

물론 활동이 죽었으므로 뒤로 버튼을 눌렀을 때 확실하지 않으므로 마무리를 죽이는 것이 중요합니다. 질문에서 질문하는 것이지만 메모리를 해제 한 후에 OS가 자동으로 수행합니다. – ingsaurabh

+2

절대적으로 아닙니다. 활동이 앞에 있지 않으면 OS에서 회수 할 수 있습니다. 완료 여부. – EboMike

4

글쎄, 당신이 onPause()이 때 다른 활동 향상 초점이라는 것을 알게 될 것입니다 활동이 추가 활동이 더 이상 표시되지 않으면 onStop()이 호출됩니다.

아직 배운 내용에서 활성 상태이거나 포커스가있는 활동에서만 finish()으로 전화 할 수 있습니다. onPause() 메쏘드에서 finish()으로 전화를 걸면 더 이상 액티비티가 활성화되지 않았을 때 전화하는 것입니다. 따라서 예외가 throw됩니다.

finish()에서 onStop()으로 전화를 걸면 해당 활동이 백그라운드로 전송되어 더 이상 표시되지 않으며이 예외가 표시됩니다.

back 단추를 누르면 onStop()이 호출됩니다.

아마도 Android가 현재 원하는 작업을 자동으로 처리합니다.

6

우선, 은 프로세스를 파괴하지 않고 메모리를 비우지 않습니다. 액티비티 스택에서 액티비티를 삭제하면됩니다. 이 과정을 죽여야 할 것입니다.이 과정은 많은 질문에 응답됩니다 (여러 번 묻기 때문에).

그러나 적절한 답은 - 입니다. Android OS는 메모리가 필요할 때 메모리를 자동으로 비 웁니다. 메모리를 확보하지 않으면 사용자가 다시 돌아 오면 앱이 더 빨리 시작됩니다.

see here을 작성하여 주제에 대한 훌륭한 글을 올리십시오.

@Override 
    public void onBackPressed() { 
      super.onBackPressed(); 
      this.finish(); 
    } 
+7

액티비티가 많은 리소스를 사용하고 있다면 GC를 기다리지 않고 애플리케이션 내부에서 리소스를 죽이지 않는 이유는 무엇입니까? 그 모든 과정을 거쳐야 할 것이므로 전화기 속도가 느려집니다. 좋은 메모리 관리는 프로그램 내에서 그것을 관리하려는 모든 시도를하고 있습니다. 대부분의 관리 프로그래밍 언어와 IDE가 자동 정리 코드를 프로그램에 자동으로 넣는 이유와 그 프로그램이 라이프 사이클을 제공하는 이유 때문에 응용 프로그램 내에서 가능한 한 최선의 메모리를 관리 할 수 ​​있습니다. – Shaun

+1

숀 (Shaun)이 옳다. 좋은 메모리 관리는 프로그램 자체 내에서 그것을 관리하려는 모든 시도를하고있다. – dns

61

간단한 오버라이드 방법을 onBackPressed.

13
public boolean onKeyDown(int keycode, KeyEvent event) { 
    if (keycode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
    } 
    return super.onKeyDown(keycode, event); 
} 

내 응용 프로그램은 위의 코드를 폐쇄 :

+0

작동 중입니다. 감사합니다. – Mohsen

+0

앱은 작동하지만 앱이 항상 죽지 않을 때마다 동일한 페이지가 열려 있습니다. –

+0

하지만 Launcher 활동에서 앱을 시작하고 싶습니다. –

관련 문제