본문 바로가기

소프트웨어/Android/Java/Ndk

Android] Service가 Kill당했을때 Activity의 복구

Activity에 startService(Service service)를 하면 서비스가 무리없이 잘 등록된다.

그런데 android Service는 Device에서 Memory가 부족할때 우선순위에 따라서 Kill당하게 된다. 이 부분은 

Service의 onStartCommand()매서드의 return값을 

return Service.START_STICKY;

로 설정하면 memory가 여유로워지면 자동으로 다시 서비스를 생성한다. 로그를 찍어보니 

=> startService(Service service); //activity에서 service 등록부분

=> 서비스의 onCreate()

의 순서로 다시 등록이 된다.( 다시 살아나면 onStartCommand가 살아날 줄 알았는데 의외네)


어쨌든 이렇게 Service가 살아나게 설정하는건 참 쉽다.

그런데 만약 Service에서 Activity상의 자원을 이용한다면 문제가 생긴다. 당연히 Service가 살아나면 Service등록을 실시한 Activity도 살아날거라 생각했지만 Activty내의 startService() 매서드만 불릴뿐 Activity는 재 생성되지 않는것이다. 그래서 Activity의 공유자원이 모두 null로 뜨는것이 아닌가. 


이 문제를 해결하기 위해서 여러 방법을 찾아봤는데 나는 이런 방법을 사용하였다.

Service상에서 onCreate() 매서드가 실행될 때 PendingIntent를 이용하여 Activity 리로드.

Service상에서 PendingIntent를 사용하는것은 

http://mantdu.tistory.com/727

링크에 가보면 써놨다.

이렇게  Service가 KIll당하면 다시 살릴때 Activity를 리로드 함으로써 null pointer문제를 해결하였다.

(더 좋은 방법도 있을것 같은데...)




*참고_Service 강제로 KILL TEST하기

갤럭시 시리즈에서는 실행중인 Process와 Service를 Kill할수있는 기능을 제공하던데 내 구석기시대 HTC는 제공을 않더라. 그래서 찾아보니 Eclipse상에서 Service 및 Process를 Kill할 수 있단다.


Thread확인 하듯이 DDMS를 들어가자



(DDMS가 없다면 왼쪽에 Quick Access에 DDMS라고 치면 나온다)



그다음 Project의 Package를 선택하고 Stop을 누르면 Service와 Process가 Kill당한다. 

위에서와같이 return Service.START_STICKY 를 설정하였다면 수 초 후 Service와 Process가 재 실행 된다.