2012-02-26 1 views
2

해당 서비스가있는 Android 앱 (활동)이 있습니다. 서비스는 활동에 의해 시작되며 활동이 중지 된 경우에도 계속 실행됩니다. 활동이 다시 시작되면 서비스에 Y 인드하여 u 리할 수 있습니다.힙 조각화로 인해 서비스 충돌이 발생하는 Android 활동

가끔씩 활동이 파괴되고 OS에 의해 생성됩니다. 이것은 일에 영향을주지 않아야하며, 활동은 다시 만들어 져서 서비스에 다시 바인딩 될 수 있어야합니다. 이것은 기본적으로 작동합니다. 나는 달빅 VM 힙과 네이티브 힙 모두 비 성형하고, 따라서 지속적으로 활동 할 때까지 크기가 증가 것으로 나타났습니다

그러나

는 ... 메모리와 충돌 (심지어 총 메모리 그래도 부족 사용량은 실제로 일정하며 누출되지 않음). 이것은 많은 할당이 생성 과정에서 이루어지기 때문에 활동을 파괴하고 재 작성함으로써 더욱 악화됩니다.

몇 가지 재시작 후 활동이 중단 될 것이라는 거의 확실한 경고입니다. 이것은별로 신경 쓰지 않지만, 같은 응용 프로그램의 일부이기 때문에 서비스도 중단됩니다. 서비스에는 크래시 중에 손실되는 중요한 데이터가 포함되어 있습니다.

이 문제를 해결하는 방법에 대한 제안이 있으십니까?

서비스를 활동에서 분리하는 방법 (활동이 충돌 할 때 서비스가 중단되지 않도록)이 서비스와 활동을 동일한 응용 프로그램에 계속 유지할 수 있습니까?

서비스 데이터를 유지할 수 있지만 DB에 많은 액세스가 필요하며 배터리 절약에 도움이되지 않습니다.

답변

0

서비스가 작동하지 않는 활동에 대한 참고 사항을 유지하고있는 것으로 들립니다. 바운드 서비스가 아닌 시작된 서비스를 사용해야합니다. 차이점과 각 차이점을 사용하는 방법에 대한 자세한 내용은 Services의 가이드 항목을 참조하십시오.

바운드 서비스를 사용하려는 경우 (즉, 어떤 이유로 든 bindService()을 사용해야하는 경우) 활동이 종료되기 전에 unbindService()으로 전화하십시오. 마지막 활동이 바인딩 해제되면 서비스가 중지됩니다.

+0

에있을 것입니다, 나는 실제로 unbindService를 호출 할(). 문제는 서비스가 여전히 실행 중이므로 (의도 된) 현재 힙이 활성 상태로 남아 있기 때문입니다. 활동이 재시작 될 때 서비스와 동일한 힙을 사용하는데, 이것은 현재 심각하게 단편화되어 있습니다. – chris

+1

@chris - 귀하의 가설을 테스트하려면 서비스의 [android : process'] (http://developer.android.com/guide/topics/manifest/service-element.html#proc) 값을 지정하십시오. 명백한. 그러면 서비스가 앱의 활동과 별도의 프로세스에 배치됩니다. –

0

매니페스트에 "프로세스 이름"서비스를 지정해야하며 ':'또는 소문자로 시작할 수 있습니다. 인용합니다 : http://developer.android.com/guide/topics/manifest/service-element.html

이 속성에 할당 된 이름은 콜론 (':')로 시작하는 경우가 필요한 때 생성하는 새로운 프로세스, 응용 프로그램에 개인 및 서비스가 그 프로세스에서 실행 . 프로세스 이름이 소문자 인 으로 시작하는 경우 서비스는 해당 이름이 인 글로벌 프로세스로 실행됩니다 (제공 할 권한이있는 경우).

예를 들어 내가 모두 시작 바인딩 된 서비스를 필요로하는 매니페스트

<service android:name=".services.OfficeService" 
      android:process=":myProcess" /> 
관련 문제