2011-10-05 4 views
12

XMPP를 통해 푸시 알림을받는 애플리케이션을 개발 중입니다. (C2DM을 알고 있지만 몇 가지 제한이있어서 사용할 수 없습니다.) 문제는 몇 시간 후에 가비지 수집되고 나는 안드로이드 장치에 푸시 알림을 보낼 수 없습니다 연결.Android에서 XMPP 연결 유지 (asmack 사용)

Android 서비스를 구현해야한다고 생각하지만 연결을 유지하는 서비스를 구현하는 방법을 모릅니다. 누군가 나를 도울 수 있습니까?

답변

20

"가비지 수집"이 올바른 용어인지 확실하지 않습니다. 액티비티에서 연결을 생성하기 때문에 Android에서 단순히 활동을 종료 할 가능성이 큽니다.

맞습니다. 안정적인 연결을 유지하려면 XMPP 연결을 Service에 넣어야합니다. 그러나 서비스 자체가 추가 프로세스 나 스레드가 아니기 때문에 연결이 여분의 스레드에 있는지 확인하십시오. 예를 들어 Handler을 사용하여이 작업을 수행 할 수 있습니다.

HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME); 
thread.start(); 
handlerThreadId = thread.getId(); 
serviceLooper = thread.getLooper(); 
serviceHandler = new ServiceHandler(serviceLooper); 

메시지/의도를 통해 서비스 스레드와 통신 할 수 있습니다. 또 다른 대안은 Binder 인터페이스입니다.

다른 사람들이이 작업을 수행하는 방식을 살펴볼 수도 있습니다. BeemGTalkSMS은 모두 Android 서비스와 XMPP 연결을 구현하는 오픈 소스 프로젝트입니다. GTalkSMS는 IntentService approach을 사용하지만 Beem은 Binder을 사용하여 XmppConnection과 통신합니다.

우리는 GTalkSMS와 꽤 안정적인 연결을 유지하고 있지만 GTalk 서비스/클라이언트의 주식은 결코 좋지 않습니다. 한 가지 이유는 기본 keep-alive check timer가 5 분이기 때문에 가능한 한 많은 배터리를 절약하려는 경우 모바일 장치에서 자주 사용하는 방법입니다. 그래서 나는 그것을 더 높은 가치로 설정해야만했다. 이것은 몇 가지 결점이있다. 빠른 속도, 응답 성, 안정적인 연결 대 배터리 수명은 항상 균형을 유지합니다.

+1

onCreate() 메서드에서 ServiceHandler, Looper 및 Handler Thread를 사용하여 sugestion을 작성한 서비스를 만들었으므로 이제 연결이 유지되고 서비스가 실행 중입니다. 다시 한번 감사드립니다. – danilodeveloper

+0

당신은 @danilodeveloper 코드를 공유하겠습니까? 나는 그런 문제에 직면하고 있습니다. 백그라운드에서 msg를받지 못했습니다 (채팅 활동이 아닌 다른 활동에있는 것처럼). xmpp 연결 클래스를 공유하십시오. –

+0

안녕하세요 @DevendraSingh, 불행히도 제가 5 년 전에이 질문을했습니다. 이제 코드가 없습니다. 미안합니다 :( – danilodeveloper