2012-06-12 2 views
0

연구원 어려움을 겪고 프로그래머. Google 서버가 장치에 장치를 푸시 할 때 생성 된 인 텐트를 수신하려면 응용 프로그램 내에 서비스를 구현해야합니까?C2DM 조언 내가 C2DM에 관한 모든 문서를 협의했지만 여전히 몇 가지 조언을 찾고</p> <p>

https://developers.google.com/android/c2dm/

문서는 의도가 응용 프로그램 매니페스트에 올바른 텐트 필터 및 사용 권한을 가진받을 때이 응용 프로그램을 깨울 것입니다 상태

http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html. 그러나 앱이 메모리에로드되지 않은 경우 어떻게 가능합니까? OS가 어디로 가는지 어떻게 알 수 있습니까?

알림을받을 때 내 앱을 시작할 권한이있는 백그라운드 서비스가 있어야하는 것처럼 보입니다.

누구나이 아이디어에 대해 통찰력을 갖고 있습니까?

C2DM

를 사용하여 백그라운드 서비스를 구현하거나 불필요한 것으로 확인했다 아마도 누군가.

+0

처음에는 : 응용 프로그램 시스템 업데이트를 설치할 때 "내부 의도 데이터베이스".... 두 번째 : 나는 C2DM이 푸시되지 않지만 내부 안드로이드 서비스가 긴 시간 동안 풀이 될 것이라고 확신합니다. 그것은 "C2DMBroadcastReceiver"에 특정 의도 필러와 매개 변수를 전달하는 모든 응용 프로그램을 시작한다는 의미의 "send broadcast"메시지를받습니다. http://code.google.com/p/chrometophone/source/checkout (' C2DMBaseReceiver'와'DeviceRegistrar'를 확장하는'C2DMReceiver' 만 구현하면됩니다. – Selvin

답변

2

의도 필터는 응용 프로그램 또는 서비스를 시작하지 않아도됩니다. OS가 인 텐트 필터를 등록한 이벤트가 발생하면 인 텐트 필터가 첨부 된 인 텐트가 매니페스트에 표시된대로 실행됩니다.

+0

통지가 수신 될 때 느린 작업을 수행하려고한다면 서비스가 유용 할 것입니다. – Kamchatka

0

일반적으로 서비스가 필요하지 않습니다. 메시지에 어떤 반응이 필요한지에 따라 다릅니다. 활동을 시작하려면 C2DM 메시지 수신자로부터 직접 활동을 시작하십시오.

그런데 C2DM 인 텐트는 서비스 의도가 아닙니다. 그들은 수신기의 의도입니다. 원하는 경우에도 서비스는이를 포착 할 수 없습니다. API 수준에서는 그 자체 인을 호출 할 수 없습니다. startActivity() 또는 start/bindService() 또는 sendBroadcast()으로 전화를 겁니다. 호출 된 API에 따라 시스템은 활동, 서비스 또는 수신자에 대한 의도를 일치시킵니다.

저는 C2DM을 구현했습니다. 제 경우에는 서비스가 있습니다.하지만 이는 앱에서 C2DM 메시지에 대한 반응이 UI가없는 HTTP 요청이므로 시간이 걸릴 수 있기 때문입니다. 이는 사물의 거대한 계획에서 다소 일반적인 패턴으로 보입니다. C2DM은 단지 방아쇠 일 뿐이며 앱에 새로운 데이터가 백엔드에서 기다리고 있다고 알려줍니다. 이 시나리오에서 서비스는 백엔드에 상기 새 데이터를 조용히 쿼리하여 처리합니다. 그게 내 사건이야. 그러나 그렇게 할 필요는 없습니다.

리시버 개체가 일시적이기 때문에 리시버 자체가 HTTP의 좋은 수단이 아닙니다. 일단 의도가 전달되면 안드로이드는 수신기가 완료되었다고 가정하고 버립니다. 그런 다음 앱의 프로세스에는 실행중인 개체가 없으며 언제든지 종료 될 수 있습니다. 한 번 시작된 다른 손의 서비스는 명시 적으로 완료 될 때까지 실행됩니다 (stopService()이 호출 됨). 그건 안드로이드에게 앱이 뭔가를하고 있다는 것을 알려주므로 종료하지 마십시오. 실행중인 서비스는 메모리가 부족한 경우 앱이 종료되지 않을 것이라는 확실한 보장이 아니지만 아무것도없는 것보다 낫습니다.

기술적으로 말하면 앱이 실행중인 것은 브로드 캐스트 수신기뿐입니다. Android는 C2DM 메시지가 도착하면 앱 (기본 활동이 아닌 프로세스)을 시작합니다. 사용자가 일부 UI를 플래시하지 않으면 사용자는 알 수 없습니다. 리시버에서 앱의 다른 구성 요소를 불러오는 것은 귀하에게 달려 있습니다.