2011-09-05 3 views
33

내 앱은 매일 특정 시간에 웹에서 일부 데이터를 가져와야합니다. 따라서 AlarmManager를 사용하여 작업을 예약하면 정상적으로 작동합니다.AlarmManager와 함께 PendingIntent.getService() 또는 getBroadcast를 사용해야합니까?

그러나 여러 가지 예를 살펴보면 보류중인 의도와 관련하여 AlarmManager를 처리하는 두 가지 방법이있는 것으로 보입니다.

하나는 PendingIntent.getBroadcast()을 사용하여 경보가 울리고 실제 작업을 수행 할 서비스가 시작될 때 브로드 캐스트 수신기를 호출합니다.

또 다른 접근법은 PendingIntent.getService()을 사용하고 해당 알람이 울리면 직접 서비스에 전화하는 것입니다.

누군가 내가 두 방법의 차이점을 설명 할 수 있으므로 어느쪽에 의존할지 결정할 수 있습니까?

EDIT : getService()를 사용할 때 wake lock을 얻을 수있는 또 다른 질문은 무엇입니까?

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); 
: 내가 대신 같은 서비스를 직접 호출하는 경우

WakeReminderIntentService.acquireStaticLock(context); 

가 어떻게 깨우기 잠금을 획득해야하십시오 브로드 캐스트 리시버를 사용하는 경우

예를 들어, 나는 onReceive()에 다음 줄을

대신 간단히 서비스에서 가져와야합니까?

+0

정말 상관 없습니다. IntentService 또는 Service 또는 로컬 또는 글로벌 브로드 캐스트를 사용할 수 있습니다. 당신은 그들 모두에서 똑같이 할 수 있어야합니다. –

답변

16

PendingIntent.getBroadcast()broadcast receiver을 사용하여 알람이 울리고 실제 작업을 수행 할 서비스가 시작됩니다.

PendingIntent.getService()를 사용하고 알람이 울릴 때 직접 서비스를 호출 할 수

또 다른 접근 방식보다는 시작 서비스에서 한 단계가 있습니다. 그것을 실행에 한 단계 감소 될 때

그런 다음 두 번째 방법을 사용한다 ..

+1

"그런 다음 두 번째 방법을 사용하여 한 단계의 실행을 줄여야합니다."유일한 차이점이라면 반드시 그렇습니다.그러나 성능에 영향을 미칠 수있는 더 미묘한 차이가 있다면 궁금합니다. – marlar

+0

성능에 영향을 줄 수있는 다른 요소가 없다고 생각합니다. –

+0

감사합니다. 내 업데이트 된 질문을 참조하십시오. – marlar

11

당신의 편집을 읽고 난 당신이 자신을 발견 가정 : 사용할 때이 서비스가 시작되어 있는지 확인하려면 경우 AlarmManager의 경우 수신기로 첫 번째 전송을 우회하여 웨이크 잠금 장치를 확보하는 것이 좋습니다. 그렇지 않으면 요청한 서비스가 시작되기 전에 전화기가 잠자기 상태 일 수 있습니다. 그게 javadoc of AlarmManager의 말이고 나는 또한 Google engineer에 의해 그것을 읽었습니다.

이제 편집을 위해 : 잠금을 획득 할시기는 언제입니까? 수신자를 사용하는 요점은 수신자의 onReceive() 메소드 내에서 잠금을 획득하는 것입니다. Android가이 메소드를 실행하는 동안 잠들지 않기 때문입니다.

예제는 question을 참조하십시오.

관련 문제