2017-02-10 5 views
0

저는 IntentService이며 아직 실행 중이 아니면 startCommand을 호출하려고합니다.한 번만 IntentService를 실행하십시오.

이 서비스는 데이터베이스의 기존 행을 모두 처리하기 때문에 발생합니다. 여러 번 시작하도록 호출 할 수 있지만 이미 실행중인 경우 다시 시작하면 안됩니다. 처리 할 행이 없으면 IntentService과 유사하게 처리가 끝나야합니다.

달성 가능합니까? 아마도 PendingIntentFLAG_NO_CREATE일까요?

나는 ServiceIntentService 대신 별도의 스레드로 이것을 만들 수 있지만 IntentService에는 이미 스레드가 구현되어 있습니다.

답변

1

아마도 PendingIntent 및 FLAG_NO_CREATE가있을 수 있습니까?

해당 플래그는 서비스가 아닌 PendingIntent을 만드는 것을 나타냅니다.

달성 가능합니까?

단계 # 1 : 커프 오프

서비스에서 처음 false로 설정 (여기 isRunning이라고도 함) AtomicBoolean 필드를 추가 할 수 있습니다.

단계 2 : 덮어 쓰기 onStartCommand(). isRunningfalse 인 경우 true으로 설정하고 super.onStartCommand()으로 연결하여 정상 IntentService 동작을 상속합니다. isRunningtrue 인 경우 super.onStartCommand()으로 연결하지 마십시오.

단계 # 3 : onHandleIntent()에서, 당신은 finallyfalseisRunning을 설정 try/finally 블록, 모든 작업을 마무리.

net : startService() 호출은 onHandleIntent()이 아직 실행 중이 아닌 경우에만 IntentService 처리를 통과합니다.

+0

감사! Ohhhh 멋지다! 트릭은 기본 클래스'IntentService' 구현을 선택적으로 호출하는 것입니다 ... –

+0

그래서'PendingIntent'가 필요 없으므로'startService (intent)'를 호출하면됩니까? –

+1

@DonBox : 직접 서비스를 시작하려면'startService()'를 호출하십시오. 서비스를 시작하기 위해 다른 것을 원하면 (예 :'AlarmManager','Notification') 당신은'PendingIntent'를 사용합니다. – CommonsWare