0

내 활동 (A라고 함)은 IntentService (IS라고 함)를 큰 작업 (T라고 함)의 한 단계로 시작합니다. IS는 1 시간 이상 실행할 수 있습니다. 그것이 끝나면 어떻게 든 A에게 말해야합니다. 그래서 A는 T 작업의 다음 단계를 밟을 수 있습니다. 그러나 IS가 끝날 때까지는 사용자가 A를 모두 죽이는 등 많은 일을했을 수도 있습니다. 그럼에도 불구하고 사용자가 다시 시작하면 A는 IS가 완료되었음을 인식해야하므로 A가 T 작업에서 다음 단계를 수행 할 수 있습니다.IntentService에서 현재 실행 중이 아닌 활동으로 통신하는 방법은 무엇입니까?

IS에서 A로 통신하는 방법에 대한 많은 제안 사항이 있습니다. 의도, PendingIntent, 브로드 캐스트 및 리시버, ResultReceiver, Messenger thread 등등. [간단한 검색 결과를 보여주기 때문에 링크를 제공하지 않았습니다.] 그러나 모두 메시지가 전송 될 때 A가 살아 있다고 가정합니다. 그것은 단순히 사망 한 A에게 메시지를 보낼 수없는 것 같습니다.

또는 그럴 수 있습니까?

SharedPreferences는 IS에서 A로 메시지를 지속시키는 방법 일 수 있습니다. 끝나면 IS는 SharedPreferences에서 플래그 F를 설정합니다. 이제 F는 F가 설정되어있을 때 A가 죽은 경우에도 지속됩니다. 사용자가 A를 다시 시작하면 F를 확인합니다. F가 설정되면 A는 IS가 완료되었음을 알게되고 이제는 A가 작업 T에서 다음 단계를 수행 할 수 있습니다.

또한 A에 SharedPreferences Listener가 있으면 IS가 신호를 보낼 수 있습니다 A가 죽었거나 살아 있는지 여부. IS는 의사 소통의 수단을 전혀 필요로하지 않습니다.

실제로 SharedPreferences라고 생각됩니다. 메시지가 간헐적으로 짧고 짧은 경우에만 청취자가 일반적으로 의사 소통 및 조정을위한 가장 좋은 방법 일 수 있습니다.

의미가 있습니까? SharedPreferences는 메시징 용으로 설계되지 않았으므로 일부 숨겨진 결과가 두려워합니다. 어떻게 생각해? 것 같다

답변

0

올바른 죽은 A.에게 메시지를 보낼 수 없습니다 단순히입니다. 이벤트 버스를 사용하여 A가 픽업 할 수있는 이벤트를 게시 할 수 있으며, A가 픽업하지 않으면 A에 대한 세부 사항을 나중에 알 수 있습니다.

나는 이러한 샘플 응용 프로그램의 기본 이벤트 버스 "UI 또는 대체"패턴을 보여줍니다 내 경우에는

를 대체 행동 Notification을 제기하는 것이지만 이것은 필수 조건은 아닙니다.

된 SharedPreferences 메시징을 위해 설계되지 않은, 그래서 나는

하나는 성능 일부 숨겨진 결과를 우려하고있다. SharedPreferences은 항상 디스크 I/O를 수행합니다. A를 실행중인 인스턴스가없는 경우 대체를 사용하면됩니다. 항상 사용하는 것은 이상적이지 않습니다.

여기에 SharedPreferences을 사용하는 것에 관해서도 마술 같은 점은 없습니다. 어떤 유형의 지속성 (예 : 데이터베이스, 다른 종류의 파일)이든 작동합니다. 특히 대기열에 넣어야하는 IS의 메시지가 여러 개인 경우 Tape을 사용하는 것이 좋습니다.

+0

IS-to-A 통신에 LocalBroadcastManager를 사용했지만 A가 활성 상태라고 가정합니다. 나는 Otto를 점검했다. 그리고 그것은 좋게 보인다. 그러나 나는 문제가있다. 나는 다른 라이브러리를 사용할 때마다 dex 한계를 불어 난다. 그래서 이미 사용하고있는 시설을 다시 사용하는 것이 매력적입니다. SharedPreferences (SP)와 청취자를 사용하는 "Gotcha"가 없으면 매우 매력적입니다. 디스크 I/O 문제는 미미합니다. 결국 IS는 1 시간 이상 실행됩니다. 디스크 I/O의 10 분의 1은 사용자가 알 수 없습니다. 나는 SP를 시도 할 것 같아. 행운을 빌어! 답장을 보내 주셔서 감사합니다. 나는 정말로 당신의 책과 다른 사람들을 돕는 것에 대한 열정에 감탄했습니다. – BinCodinLong