2012-07-02 2 views
4

내 앱에 GCM을 구현했으며 here으로 GSMRegistrar을 사용하고 있습니다. 아니 나는이에서 이해할 수있는 어떤 로그 캣Google 클라우드 메시징에 유출 된 IntentReceiver

7-02 23:35:15.830: E/ActivityThread(10442): Activity com.abc.xyz.mnp has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 

에 오류가 발생하고 GSMRegistrar의 코드 내가 GSMRegistrar.onDestroy(this)를 호출 할 필요가 있지만이를 호출해야합니다 어디 이해할 수 없었다이다에서 찾고 있어요? onDestroy() 액티비티 mnp을 호출하면 다시 시도하지 않습니다. GSM Registartion

답변

12

응용 프로그램 컨텍스트를 사용할 수 있습니다에 GCMRegistrar을 파괴해야합니다. 그런 식으로 백 오프 메커니즘은 활동 라이프 사이클에 의해 제한되지 않습니다.

+0

감사합니다. 도움이됩니다. 예 : 다음과 같이하십시오. GCMIntentService.register (getApplicationContext()); 대신 다음과 같이 입력하십시오. GCMIntentService.register (RegisterActivity.this); –

8

GCM 등록을 시작한 활동의 ​​onDestory() 메소드 내부에서 호출해야합니다.

다른 활동이 그 위에 실행 되더라도 활동이 삭제되지 않을 수 있습니다. 따라서 귀하의 등록은 여전히 ​​백그라운드에서 재 시도 될 수 있습니다. 등록 활동이 파괴되면 GCMBroadcastReceiver 클래스는 응답을 처리 할 수 ​​없습니다.

업데이트 : 더주의 깊게 GCM 라이브러리 소스 코드를보고 한 후, 여기에 내가 관찰 한 내용은 다음과 같습니다

  1. GCM 라이브러리는 수신기를 등록 활동 컨텍스트를 사용하여 재 시도 등록을 목적으로하는 경우 실패하면 재 시도 메커니즘을 사용합니다.
  2. 액티비티의 onDestroy() 메소드에서 GCMRegistrar.onDestroy()를 호출해야합니다. 액티비티가 삭제되기 전에 수신자 등록을 취소하는 것이 좋은 Android 실습입니다.
  3. # 2로 인해 GCMRegistrar.register를 호출하는 활동이 삭제 된 경우 앱에서 재 등록을 시도하지 않습니다. 사용자는 등록 프로세스가 다시 시작되도록이 활동으로 돌아 가야합니다.
  4. 동작 # 3을 원하지 않으면 자신의 GCM 등록을 구현하고 다시 시도해야 할 수 있습니다. 예를 들어 재시도 메커니즘이 별도의 백그라운드 스레드에서 수행되면 응용 프로그램이 실행되는 동안 활동이 삭제 되더라도 계속 시도 할 수 있습니다.

GCM 서버가 'SERVICE_NOT_AVAILABLE'오류로 등록을 거부하는 것은 매우 드뭅니다. 조만간 사용자가 앱을 몇 번 실행하면 조만간 기기가 성공적으로 등록됩니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. * 등록 활동이 파괴되면 GCMBroadcastReceiver 클래스가 응답을 처리하지 못하게됩니다. * 왜 그렇게 말합니까? –

+1

GCMRegistrar.register (this, xxxx)를 호출 할 때; GCM 라이브러리는 활동 컨텍스트를 사용하여 응답을 처리합니다. OS (아마도 메모리 부족 상황)로 인해 활동이 파괴 된 경우 해당 컨텍스트는 더 이상 유효하지 않으므로 GCM 라이브러리에서 응답을 받으면 응용 프로그램이 파괴 된 컨텍스트를 참조하여 예측할 수없는 결과를 초래할 수 있습니다. 따라서 활동이 파괴 될 때 GCMRegistrar.onDestory()를 호출하는 것이 더 안전합니다. 귀하의 의견에 – azgolfer

+0

+1, 이것에 대해 더 자세히 설명 드리겠습니다. 왜 액티비티 컨텍스트가 아닌 응용 프로그램 컨텍스트를 사용합니까? –

2

는 대신 활동 컨텍스트의, activty 클래스의 사용자들의 OnDestroy 방법

 unregisterReceiver(receiver); 
     GCMRegistrar.onDestroy(this);