2014-03-04 4 views
2

우리는 데이터를 수집하기 위해 전경 서비스가 필요한 앱을 개발 중입니다. 안드로이드가 프로세스를 다루는 방법과 그것이 전경 서비스에 묶여있는 경우의 활동을 이해하려고 노력 중이다.안드로이드는 더 많은 메모리가 필요하다면 무엇을 버리기로 결정합니까?

안드로이드는 더 많은 메모리가 필요하면 무엇을 버리기로 결정합니까? 전체 과정 또는 활동 만? 예상되는 행동은 무엇입니까?

추가 질문 : 어떤 일이 발생하면 알려야합니까? Activity.onDestroy? 해고 당할 수 있나요?

답변

1

전체 프로세스하거나 활동?

안드로이드는 프로세스를 종료합니다. 은 직접 활동을 제거 할 수 있습니다 (예 : finish()). 가비지 수집시 Android는 일부 힙 공간을 시스템에 반환 할 수 있습니다. 그러나 Android는 이러한 방식으로 개별 구성 요소를 사전에 제거하지 않습니다. 전체 프로세스이거나 아무것도 아닙니다.

추가 질문 : 어떤 일이 발생하면 알려야합니까? 프로세스가 종료 될 때

아무것도 호출하지 않습니다.

+0

따라서 프로세스가 종료되기 전에 프로세스 상태를 저장할시기를 알 수있는 방법이 없습니까? – Sten

+0

@Sten : 수정하십시오. 상태가 변경되면 상태를 저장하십시오. – CommonsWare

2

메모리가 필요하면 Android에서 전체 프로세스를 종료합니다.

활동이 해제 된 후 가비지 수집 대상이되고 공간이 여유 공간 내에서 내입니다. 프로세스 내 공간을 확보해도 Android에서 사용할 수있는 메모리에는 아무런 영향을 미치지 않습니다.

Activity.onDestroy는 최선형이라고합니다. onDestroy 메서드를 호출하지 않고도 Activity가 파괴 될 수 있습니다. onPause가 보장됩니다.

안드로이드 각 공정 우선, -15 ~ 16의 숫자라고 oom_adj 할당한다. 숫자가 클수록 프로세스가 죽을 확률이 높습니다. 시스템 응용 프로그램에만 oom_adj<이 있습니다. 현재 표시된 응용 프로그램에는 oom_adj가 0입니다. UI가없고 실행중인 서비스가 4-5 영역에 있습니다. 가시적이지 않고 실행중인 서비스가없는 프로세스는 oom_adj가 더 높을 것이고 백 스택에없는 프로세스는 가장 높은 값을 가질 것입니다.

각 장치는, 컴파일 된 테이블, 안드로이드 시스템의 일부를 보유하는 메모리 부족 조건 어소 oom_adj 값. 예를 들어, 안드로이드가 마지막 8M 메모리로 내려 가면 oom_adj가 12 이상인 모든 프로세스를 종료해야한다는 것을이 테이블은 말합니다. 메모리 상황이 더욱 심각 해지면 안드로이드는 oom_adj가 낮거나 낮은 프로세스를 죽일 수 있습니다.

안드로이드가 메모리를 필요로하기 때문에 프로세스가 kill 될 때, kill -9와 동일하게 처리됩니다.

+0

dammit! commonsware에 의해 다시 찔렀다! :-) –

0

Android 구성 요소를 호스팅하는 프로세스가 너무 많은 메모리를 사용한다고 생각하면 프로세스가 종료됩니다. 당신의 아르가 전경 서비스를 사용하기 때문에

하지만, 안드로이드는 메모리 리소스가 매우 낮은 될 때까지이 처리 죽이지에 열심히 노력합니다.활동의 경우이 시나리오에서 활동이 중단 될 경우에 대비하여 데이터를 저장하려면 onSavedInstanceState을 겹쳐 써야합니다.

또한 리소스를 회수하기 위해 시스템에서 프로세스를 종료하려면 가능한 한 메모리 사용 공간을 줄여야합니다. UI 리소스와 함께 활동은 대개 서비스보다 많은 메모리를 사용하기 때문에 두 프로세스에서 서비스와 활동 구성 요소를 분리 할 수 ​​있습니다. 별도의 프로세스에서 활동 구성 요소를 호스팅하면 서비스가 활동과 함께 종료되지 않도록 보호 할 수 있습니다.

관련 문제