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를 사용하는것은
링크에 가보면 써놨다.
이렇게 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가 재 실행 된다.
'소프트웨어 > Android/Java/Ndk' 카테고리의 다른 글
Android] java. TXT파일을 읽어서 특정부분 지우기 (1) | 2013.12.23 |
---|---|
Android] XML상에서 Layout 둥근모서리 적용하기 (0) | 2013.12.22 |
Android] ConnectivityManager를 이용한 3g 4g wibro wifi 통신 체크 (0) | 2013.12.20 |
Android] Service상에서 Activity 띄우기 (0) | 2013.12.20 |
Android] 위젯 만들기 2 - 클릭이벤트 먹이기 (0) | 2013.12.14 |
Android] 위젯 만들기 - 1. 위젯 껍데기 만들기 (0) | 2013.12.14 |
java] ArrayList와 Hashmap검색속도관련 (1) | 2013.12.12 |