답변:
참고 : 동기화 어댑터는 비동기식으로 실행되므로 데이터를 정기적으로 효율적으로 전송하지만 즉시는 전송하지 않을 것으로 예상해야합니다. 실시간 데이터 전송을 수행해야하는 경우 AsyncTask 또는 IntentService에서 수행해야합니다. - 소스 .
기본적으로 실시간 전송이 필요한 경우 IntentService (첫 번째 옵션), 그렇지 않으면 SyncAdapter를 사용하십시오. IntentService는 더 커스터마이징이 가능하지만 SyncAdapter를 사용하는 것이 더 사소한 접근 방식이기 때문에 선호합니다.
어떤 종류의 동기화가 필요한지에 따라 크게 달라집니다.
앱이 매일 특정 시간에 게시물을 게시하는 뉴스 앱인 경우 (매일 오전 7시 45 분에 말해야 함) 백그라운드 서비스에서 오전 8시에 정기적 인 작업을 실행합니다.
예 : Drippler. 그들은 매일 한 번 (오후 6시 30 분) 알려줍니다. 나는 그들이 정기적 인 작업을 사용한다고 생각합니다.
사용자 작업으로 데이터 전송이 트리거 된 경우 백그라운드 서비스 또는 AsyncTask를 사용하여 데이터를 전송하십시오.
예 : DropBox / Evernote. 앱과 상호 작용할 때 동기화됩니다.
앱에서 인스턴트 메시징 / 메일 / 비정기 중요 업데이트를 실행하는 경우 사용자에게 즉시 알리려고 푸시 알림이 필요합니다. 이 경우 GCM 또는 Parse를 사용하십시오. 예 : WhatsApp / Google 채팅 당신이 명시 적으로 사용 GCM 싶지 않아 언급하기 때문에 당신은 왜, 나는 말할 것입니다 한다 대신 자신을 작성하는 표준 푸시 알림 공급자를 사용 :
푸시 알림은 즉시 작동합니다. 지연이 거의 없습니다 (몇 초, 몇 분 정도). 순진한 모델에서이 작업을 수행하기 위해 자체 솔루션 / 라이브러리를 구현하는 경우 상태를 확인하기 위해 1 초 또는 5 초 또는 1 분마다 서버를 ping합니다. CPU (및 배터리), 모바일 대역폭 및 서버로드를 소비하므로 매우 비효율적입니다. 그러나 GCM / Parse에서는 항상 서버에서 포트를 열어 둡니다 ( 여기 참조 ). 이것이 표준적이고 가장 효율적인 방법입니다. 또한 10 개의 앱이 GCM을 사용하는 경우 10 개의 열린 연결이 필요하지 않으며 기기 당 하나만 필요합니다. 그리고 정당한 이유 / 펀드 / 시간이 없다면 자신 만의 솔루션을 개발하고 싶지 않습니다.
동기화 어댑터에 대한 참고 사항 : 동기화 어댑터는 위의 세 가지 경우 모두에 적합합니다. 동기화 어댑터 실행을 확인 하면 GCM 또는 자체 메커니즘 (이벤트 트리거 또는 사용자 지정 솔루션) 또는 네트워크 가용성 (이벤트 트리거) 또는 주기적 이벤트에 따라 달라집니다. 결국, 이것은 매번 긴 초기화 목록을 수행하거나 위의 모든 경우를 한곳에서 구현하지 않고도 데이터를 동기화하는 데 편리한 클래스입니다.
SyncAdapter
다른 답변에서 언급되지 않은 한 가지 측면이 있습니다 .
이 SyncAdapter
패턴을 사용하려면 동기화 할 특정 ContentProvider 권한과 동기화 할 특정 계정 유형 ( 인증 자 참조 )이 있어야합니다. 따라서 아키텍처에 이러한 구성 요소가없는 경우 (예 : 다른 앱에 데이터에 대한 액세스 권한을 부여하거나 계정을 지원해야 함) SyncAdapter
구현에 상당한 오버 헤드가 발생할 수 있습니다.
연결과 관련된 데이터 동기화와 관련하여 확장도 가능합니다. 권장되는 방법은 동기화 어댑터를 사용하는 것입니다.
Android traning guide : Sync Adapter 만들기 를 확인하면 그런 식으로 보입니다.
앱의 동기화 어댑터 구성 요소는 장치와 서버간에 데이터를 전송하는 작업에 대한 코드를 캡슐화합니다. 앱에서 제공하는 예약 및 트리거에 따라 동기화 어댑터 프레임 워크는 동기화 어댑터 구성 요소에서 코드를 실행합니다.
동기화 어댑터 는 데이터 변경, 경과 시간, 시간 등의 다양한 기준에 따라 데이터 전송을 자동화하므로 실시간 데이터가 필요하지 않은 한 사용해야합니다. 모든 데이터 전송을 중앙 집중화하여 데이터 전송이 다른 앱에서 데이터를 전송하여 배터리 사용을 줄입니다.
즉각적인 작업을 위해
짧은 기간의 작업에 대한 AsyncTask 는 3-4 초일 수 있습니다.
장기 실행 작업을위한 IntentService
디자인에 대해 이야기하고 있으므로 SyncAdapters, SyncResult 객체 및 그 이후의 작업 관리에 대해 언급해야합니다.
실제로 SyncAdapter를 사용하여 라이브러리에 서버에 대한 IntentService 웹 호출을 지시합니다. 이 "동기화"작업 관리는 까다 롭습니다.
내가 지금 취하는 한 가지 접근법은 SyncResult 객체를 완전히 버리고 서비스를 사용하여 각 개별 "Sync"의 결과를 기록하는 것입니다.