Android 파괴 활동, 프로세스 종료


117

안녕하세요 Android가 메모리를 어떻게 관리하는지 궁금합니다. 정확한 답을 어디서도 찾을 수 없습니다. 현재 활동 스택에 5 개의 활동이있는 애플리케이션 (4 개는 중지되고 1 개는 다시 시작됨)이 있고 연결된 서비스가 없다고 가정 해 보겠습니다. 모든 활동이 중지되도록 홈 버튼을 누릅니다. 다른 메모리 소비 응용 프로그램을 시작하고 전체 장치 메모리가 부족하기 시작했습니다. 그리고 질문은

... 내 신청서는 어떻게 되나요?

  1. 시스템이 메모리를 복구하기 위해 내 활동 중 하나 또는 일부만 파괴 할 수 있습니까?
  2. 시스템이 내 응용 프로그램의 전체 프로세스를 종료합니까? 모든 활동이 멋지게 파괴됩니까?
  3. 응용 프로그램이 완전히 종료되었을 때 응용 프로그램으로 돌아 가면 어떻게됩니까? 처음 시작하는 것 (첫 번째 시작과 같이)에서 시작하거나 이전 상태로 활동을 복구하려고 할 것입니까? / 그렇다면 스택의 맨 위에있는 것입니까 아니면 전부입니까?

최신 정보:

이 질문을하기 전에 활동 수명주기를 몇 번 보았지만 내 질문에 대한 답변이 없습니다. 몇 가지 테스트를했고 몇 가지 답변이 있습니다. DDMS의 "프로세스 중지"는 테스트를위한 단서였습니다.

질문 1에 대한 답변을 테스트하지 않았지만 가이드에 따르면 다음과 같습니다.

활동이 일시 중지되거나 중지되면 시스템은 완료를 요청하거나 단순히 해당 프로세스를 종료하여 메모리에서 활동을 삭제할 수 있습니다.

하나 이상의 활동이 프로세스를 종료하지 않고 부드럽게 (onDestroy 메소드를 사용하여) 파괴 될 수있는 것 같습니다. 그들에게 돌아갈 때 (onCreate + bundle) 간단히 얻을 수 있습니다.

질문 2 답변 :

예. 일반적으로 시스템은 전체 프로세스를 종료합니다. 즉, 활동 및 정적 필드를 포함한 모든 데이터가 파괴됩니다. 이것은 훌륭하게 수행되지 않습니다-일시 중지 / 중지 된 활동에 대해 onDestroy 또는 finialize ()를 얻지 못할 것입니다. 이것이 saveInstanceState ()가 onPause 메소드 바로 전에 호출되는 이유입니다. onPause는 기본적으로 무언가를 저장해야하는 마지막 메소드입니다.이 메소드 후에는 onStop 또는 onDestroy를 볼 수 없기 때문입니다. 시스템은 보유하고있는 모든 객체를 파괴하는 프로세스를 종료 할 수 있습니다.

질문 3 답변 :

종료 된 애플리케이션으로 돌아 가면 어떻게됩니까?

  • Android 2.2 이전-애플리케이션은 시작부터 시작되며 런처 활동으로 시작됩니다.
  • 2.2부터-시스템이 이전 애플리케이션 상태를 복원합니다. 무슨 뜻인가요? 이는 마지막으로 보이는 활동이 다시 생성됨을 의미합니다 (onCreate + bundle). 활동 스택은 어떻게됩니까? 스택은 괜찮지 만 모든 활동이 죽었습니다. 뒤로 버튼으로 돌아 오면 각각이 다시 생성됩니다 (onCreate + bundle). 그것에 대해 한 가지 더 있습니다.

일반적으로 시스템은 사용자가 홈 화면에서 해당 작업을 다시 선택할 때 특정 상황에서 작업을 지 웁니다 (루트 활동 위의 스택에서 모든 활동 제거). 일반적으로 사용자가 30 분과 같은 특정 시간 동안 작업을 방문하지 않은 경우이 작업이 수행됩니다.

결론?

  1. android : configChanges = "orientation"으로 활동 회전 문제를 해결할 수 있다고 생각하지 마세요. 그렇게 할 때 당신은 당신이 알지도 못하는 다른 많은 문제를 얻게 될 것입니다.
  2. DDMS-프로세스 중지 버튼으로 애플리케이션을 테스트합니다. 이것 좀 봐
  3. 정적 변수를 사용할 때는주의하십시오. 활동 1에서 초기화했을 때 활동 2에서 초기화 할 것이라고 생각하지 마십시오. 전역 정적을 초기화하는 유일한 안전한 장소는 Application 클래스입니다.
  4. onStop 또는 onDestroy는 절대로 볼 수 없습니다. 파일 / 데이터베이스를 닫고 onPause에서 다운로더를 중지합니다. 앱이 BG에서 작업을 수행하도록하려면 포 그라운드 서비스를 사용하십시오.

그게 될 것입니다 ... 내가 내 essey를 도왔기를 바랍니다 :)


당신의 가정을 위해, 그 5 가지 활동은 같은 앱에서 나온 것입니까, 아니면 여러 다른 앱에서 나온 것입니까?
dumbfingers

1
"현재 활동 스택에 5 개의 활동이있는 애플리케이션이 있습니다."물론 모두 동일한 프로세스 애플리케이션에서 가져온 것입니다.
Mark

4
감사합니다. 이것이 제 질문이기도합니다 ... 귀하의 질문과 답변이 제게 많은 도움이되었습니다.
craigrs84


@Mark :이 문제가 지금 해결 되었습니까? 만약 그렇다면?
Ameer Moaaviah

답변:


30

먼저 이것을보세요 :

img1

onPause () 시스템이 이전 활동을 재개하려고 할 때 호출됩니다. 일반적으로 저장되지 않은 변경 사항을 영구 데이터에 커밋하고 애니메이션을 중지하고 CPU를 소비 할 수있는 기타 항목을 커밋하는 데 사용됩니다.이 메서드가 반환 될 때까지 다음 활동이 재개되지 않기 때문에이 메서드의 구현은 매우 빠릅니다. 활동이 맨 앞으로 돌아 오면 onResume ()이 뒤 따르고, 사용자에게 보이지 않으면 onStop ()이 뒤 따릅니다.

onStop () 다른 활동이 재개되어이 활동을 다루고 있기 때문에 활동이 더 이상 사용자에게 표시되지 않을 때 호출됩니다. 이는 새로운 활동이 시작되거나 기존 활동이이 활동 앞에 나타나거나이 활동이 파괴되고 있기 때문에 발생할 수 있습니다. 이 활동이 사용자와 상호 작용하기 위해 돌아 오는 경우 onRestart ()가 뒤 따르고이 활동이 사라지면 onDestroy ()가 뒤 따릅니다.

따라서 장치에서 "HOME"버튼을 누르면 현재 전경 활동이 onPause() 다음에onStop() 나머지 4 개는 그대로 유지됩니다.onStop()

Google 문서에 따르면 :

  • 화면 전경 (스택 맨 위)에있는 활동은 활성 상태이거나 실행 중입니다.
  • 활동이 초점을 잃었지만 여전히 표시되는 경우 (즉, 전체 크기가 아니거나 투명한 새로운 활동이 활동 위에 초점이 있음) 일시 중지됩니다. 일시 중지 된 활동은 완전히 활성 상태이지만 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됨) 메모리가 매우 부족한 상황에서 시스템에 의해 종료 될 수 있습니다.
  • 활동이 다른 활동에 의해 완전히 가려지면 중지됩니다. 여전히 모든 상태 및 구성원 정보를 유지하지만 더 이상 사용자에게 표시되지 않으므로 해당 창은 숨겨지며 다른 곳에서 메모리가 필요할 때 시스템에 의해 종종 종료됩니다.
  • 활동이 일시 중지되거나 중지되면 시스템은 완료를 요청하거나 단순히 해당 프로세스를 종료하여 메모리에서 활동을 삭제할 수 있습니다. 사용자에게 다시 표시되면 완전히 다시 시작하고 이전 상태로 복원해야합니다.

그리고 프로세스 라이프 사이클의 경우 :

프로세스 라이프 사이클 3. 백그라운드 활동 (사용자에게 보이지 않고 일시 중지 된 활동)은 더 이상 중요하지 않으므로 시스템은 다른 포 그라운드 또는 가시적 프로세스를 위해 메모리를 회수하기 위해 프로세스를 안전하게 종료 할 수 있습니다. 프로세스를 종료해야하는 경우 사용자가 액티비티로 다시 이동할 때 (화면에 다시 표시됨) onCreate (Bundle) 메서드가 이전에 onSaveInstanceState (Bundle)에 제공 한 savedInstanceState와 함께 호출되어 사용자가 마지막으로 떠난 상태와 동일한 상태로 다시 시작할 수 있습니다.

위의 모든 인용문의 출처 : Android 개발자 참조 : 활동

메모리를 사용하는 일부 응용 프로그램을 시작하면 시스템이 비 활동적인 활동을 파괴하고 메모리를 재활용 할 수 있음이 확인되었습니다. 그리고 다음과 같이 구현할 수 있습니다. isFinishing()활동에서 DDMS의 "kill"버튼을 사용하여 시스템에 의해 삭제되는 활동을 감지합니다. 그러나 시스템이 가장 오래된 것을 먼저 파괴 할 것이라고 생각합니다. 그러나 "시작 활동"이 재활용되었을 때 다른 활동을 유지하는 것은 의미가 없습니다.

최신 정보

저는 여기에서 발견 된 일부 의견의 여기가 :

중지 된 상태

활동이 보이지 않지만 여전히 메모리에 있으면 중지 된 상태라고 말합니다. 중지 된 활동을 앞으로 다시 가져와 달리기 활동이 될 수 있습니다. 또는 파괴되어 메모리에서 제거 될 수 있습니다.

시스템은 사용자가 조만간 해당 활동으로 돌아가고 싶어 할 가능성이 높기 때문에 활동을 중지 된 상태로 유지하고 중지 된 활동을 다시 시작하는 것이 처음부터 활동을 시작하는 것보다 훨씬 저렴합니다. 왜냐하면 우리는 이미 모든 객체가 메모리에로드되어 있고 단순히 모든 객체를 전경으로 가져와야하기 때문입니다.

중지 된 활동은 언제든지 메모리에서 제거 할 수 있습니다.


4
문서는이 문제에 대해 매우 혼란 스럽지만 개별 구성 요소 (활동, 서비스 등)가 아닌 전체 프로세스 만 종료 할 수 있습니다. 참조 : stackoverflow.com/questions/7536988/…
greg7gkb

이 질문의 링크에서 정보를 업데이트해야 @ greg7gkb 의견, 그 오해의 소지가
루크 드 페오

1

시스템이 메모리를 복구하기 위해 내 활동 중 하나 또는 일부만 파괴 할 수 있습니까?

예. Android는 메모리가 필요할 때 백그라운드에서 실행중인 활동을 종료합니다. 하나 또는 모두를 죽이는 것은 일부 조건에 따라 달라질 수 있습니다. 인스턴스가 일시 중지되거나 중지되면 Android가 활동이나 프로세스 자체를 죽일 수 있습니다. 여기 에서 활동 라이프 사이클 당신은 포인트 아래를 얻을 수 있습니다. 그 페이지를 완전히 살펴 보는 것이 좋습니다. 그것은 당신의 의심을 분명히 해소 할 것입니다.

활동이 초점을 잃었지만 여전히 표시되는 경우 (즉, 전체 크기가 아닌 새 활동이나 투명한 활동이 활동 위에 초점을두고 있음) 일시 중지됩니다. 일시 중지 된 활동은 완전히 살아 있지만 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됨) 메모리가 매우 부족한 상황에서 시스템에 의해 종료 될 수 있습니다.

활동이 다른 활동에 의해 완전히 가려지면 중지됩니다. 여전히 모든 상태 및 구성원 정보를 유지하지만 더 이상 사용자에게 표시되지 않으므로 해당 창은 숨겨지며 다른 곳에서 메모리가 필요할 때 시스템에 의해 종종 종료됩니다.

활동이 일시 중지되거나 중지되면 시스템은 완료를 요청하거나 단순히 해당 프로세스를 종료하여 메모리에서 활동을 삭제할 수 있습니다. 사용자에게 다시 표시되면 완전히 다시 시작하고 이전 상태로 복원해야합니다.


시스템이 내 응용 프로그램의 전체 프로세스를 종료합니까? 모든 활동이 멋지게 파괴됩니까?

활동은 개인과 관련된 반면 프로세스는 활동 그룹과 관련됩니다. 위의 세 번째 지점을 다시 살펴보면 언급 한대로 프로세스가 종료됩니다.


응용 프로그램이 완전히 종료되었을 때 응용 프로그램으로 돌아 가면 어떻게됩니까?

restart와 유사합니다. 다시 세 번째 요점은 다음과 같은 답변을 제공합니다.When it is displayed again to the user, it must be completely restarted and restored to its previous state

여기에서 메모리 관련 항목에 대한 자세한 정보를 얻으십시오 .

편집 :
애플리케이션의 모든 활동이 단일 프로세스에서 실행됩니다. 따라서 프로세스가 종료되면 5 또는 10에 관계없이 모든 활동이 종료됩니다. 즉, 다시 시작됩니다. 다시 시작하면 응용 프로그램이 저장된 상태가 아닌 처음부터 시작됩니다.


2
활동 수명주기를 5 회 이상 보았지만 내 질문에 대한 답변이 없습니다. 당신이 말한 것은 내 앱 프로세스가 죽었을 때를 의미합니다. 앱으로 돌아 가면 이전 상태로 복원됩니다. 그래서 5 개의 중지 된 활동이 있었을 때 .. 프로세스가 종료 될 때 모두 죽었습니까 (onDestroy가 호출 됨)? 내 앱으로 돌아 왔을 때 모든 활동이 복원 되었습니까 (onCreate + 번들) 또는 스택 맨 위에있는 활동 만 복원 되었습니까 (사용자에게 표시됨)?
Mark

1
애플리케이션의 모든 활동은 단일 프로세스에서 실행됩니다. 따라서 프로세스가 종료되면 5 또는 10에 관계없이 모든 활동이 종료됩니다. 즉, 다시 시작됩니다. 다시 시작하면 응용 프로그램이 저장되지 않은 상태에서 처음부터 시작됩니다.
Vinay

1
거의 사실이지만 2.2 이상에서는 그렇지 않습니다. 페이지 상단의 내 업데이트를 참조하십시오.
Mark

1
아니요, 이것은 사실이 아니며 사실이 아닙니다. 문서에 따르면 혼란 스럽지만 다음을 참조하십시오. stackoverflow.com/questions/7536988/…
greg7gkb

2
@JJPA Android는 메모리를 회수하기 위해 단일 활동을 파괴 할 수 없으며 프로세스 만 파괴합니다. '메모리 부족 킬러'구현에 관련된 Android 핵심 팀원 인 Dianne Hackbor의 답변을 참조하세요. stackoverflow.com/a/7576275/1290264 .
bcorso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.