2010-01-14 2 views
6

백그라운드 작업을 실행하는 방법에는 몇 가지가 있습니다. 내 유스 케이스는 내 GUI가 실행 중인지 여부와 상관없이, 그리고 전화가 잠자고 있든 없든 관계없이 x 분마다 데이터 피드를 가져 오는 것입니다.백그라운드 작업 예약 방법

저는 alarmmanager를 사용하여 방송 수신자와 일치하는 인 텐트를 예약합니다. onRecieve 메서드에서 나는 AsyncTask를 생성하는 서비스 (startService)를 시작한다. 작업은 데이터를 가져 와서 저장 한 다음 서비스를 stopSelf()합니다.

onRecieve 메소드에서 서비스를 시작하기 전에 PARTIAL_WAKE_LOCK을 받고 서비스에서 stopSelf()를 호출하기 직전에 다시 릴리스합니다.

정말이 방법이 최선입니까? 이 시나리오에서 서비스가 필요합니까?

설치가 몇 시간 동안 작동하고 갑자기 멈추는이 설정에서는 이상한 동작이 발생하여 디버깅하기가 매우 어렵습니다.

누구나 같은 결론을 달성하는 간단한 간단한 방법이 있습니까?

답변

5

저는 alarmmanager를 사용하여 broadcastreceiver와 일치하는 인 텐트를 예약합니다. onRecieve 메서드에서 서비스 (startService)를 시작하면 이 AsyncTask가됩니다. 작업은 데이터 을 가져 와서 저장 한 다음 서비스를 중지()합니다.

내가 대신 AsyncTask/stopSelf() 패턴의 IntentService을 사용하는 것이 좋습니다 싶지만, 그렇지 않으면이는 소리가 보인다. onRecieve 방법에

내가는 서비스를 시작하기 전에 PARTIAL_WAKE_LOCK을 aquire, 단지 서비스 stopSelf()를 호출하기 전에, 나는 다시 놓습니다.

의미가 있습니다. 내 WakefulIntentService 오픈 소스 구성 요소에서 동일한 기능을 수행합니다.

정말로 이것을 수행하는 가장 좋은 방법입니까?

확실히 가까운 것처럼 보입니다.

도 시나리오에서 서비스가 필요합니까?

일정에 따라 수행해야 할 작업이 1 초 정도 밖에 걸리지 않는다면 BroadcastReceiver에서 처리 할 수 ​​있습니다. 그렇지 않으면 작업을 백그라운드 스레드에서 수행해야하며 BroadcastReceivers은 백그라운드 스레드를 포크 할 수 없습니다.

+0

아하! 그래서 나는 방송 reciever에서 내 asynctask를 시작할 수 없었다? 비록 내가 onrecieve에서 wakelock을 얻었고 asynctask가 끝나면 그것을 놓아도? 정보를 주셔서 감사 드리며, 내 이상한 알람이 멈추는 데 더 많은 시간을 할애해야합니다. – Wilken

+0

"방송사에서 내 asynctask를 시작할 수 없습니까?" 나는 그렇게 생각하지 않지만, 나는 그것을 시도하지 않았다.AsyncTask에는 자체 스레드 풀이 있으며, BroadcastReceiver에서 안전하게 AsyncTask를 실행할 수 있습니다. – CommonsWare

+0

IntentService를 사용해 주셔서 감사합니다. 그 사실을 몰랐습니다. 이제 서비스와 AsyncTask를 삭제했습니다. 훨씬 더 우아합니다. – Wilken