Android: рекомендации по проектированию для периодической синхронизации с адаптером синхронизации

Я использую адаптер синхронизации в своем приложении. Приложение должно выполнять синхронизацию каждые 3 часа. Это можно сделать с помощью ContentResolver.addPeriodicSync. Но до этого с каждым запросом на синхронизацию мне нужно отправлять токен доступа пользователя. Срок действия токена составляет 2 часа. Таким образом, перед любым запросом на синхронизацию необходимо иметь действительный токен доступа. Если срок действия токена доступа истек, для пользователя необходимо обновить новый токен.

Одно из решений, которое я придумал, - установить повторяющийся будильник с помощью AlarmManager. При срабатывании сигнализации запускается IntentService. и обновляет токен доступа для пользователя. После получения нового токена запрос на синхронизацию будет отправлен на SyncAdapter с использованием ContentResolver.requestSync. Я не уверен, что это хороший способ сделать или какой-либо другой эффективный подход доступен.


person Nitish    schedule 27.10.2014    source источник
comment
Как насчет того, чтобы позволить пользователю запрашивать токен доступа вручную при синхронизации?   -  person LightYearsBehind    schedule 27.10.2014
comment
Приложение будет автоматически синхронизировать данные в фоновом режиме каждые 3 часа. Как проверить, использует ли пользователь приложение, когда сработает периодическая синхронизация. Такие приложения, как gmail, facebook или twitter и т. д., никогда не просят пользователя вводить свои данные снова и снова для синхронизации. Какой методологии они придерживаются для этого?   -  person Nitish    schedule 27.10.2014
comment
Большинство токенов доступа поставляются с токеном обновления, который позволяет вам получить новый токен.   -  person ianhanniballake    schedule 27.10.2014
comment
@ianhanniballake Да, у меня есть это. Используя только это, я обновляю токен доступа. Моя проблема в том, что когда синхронизация запускается периодически, неизвестно, действителен ли токен доступа. Поэтому я опубликовал свое решение, которое я придумал, чтобы решить эту проблему во второй половине моего поста. Я не уверен, что это правильный способ сделать это или есть более эффективный способ.   -  person Nitish    schedule 27.10.2014
comment
Извините, что мое заявление о том, что пользователь запрашивает токен доступа вручную, возможно, смутило вас. Я имею в виду, что вам не нужно создавать сигнал тревоги для обновления вашего токена, просто делайте это, когда вы синхронизируете данные с помощью адаптера синхронизации.   -  person LightYearsBehind    schedule 27.10.2014
comment
@ haike00 вы имеете в виду onPerformSync адаптера синхронизации.   -  person Nitish    schedule 27.10.2014
comment
Да, это то, что я имею в виду.   -  person LightYearsBehind    schedule 27.10.2014
comment
@ haike00 В приложении несколько учетных записей. Извините, я забыл обновить это. Для каждой учетной записи я должен отправить запрос на синхронизацию.   -  person Nitish    schedule 27.10.2014
comment
Итак, я думаю, что лучше убрать будильник(и)?   -  person LightYearsBehind    schedule 27.10.2014
comment
@ haike00 Вот что я ищу.   -  person Nitish    schedule 27.10.2014
comment
@ haike00 получил мое решение. Скоро опубликую.   -  person Nitish    schedule 27.10.2014


Ответы (2)


Вы должны иметь возможность обновить свой токен в OnPerformSync с помощью AccountManager.

Ознакомьтесь с этим демонстрационным приложением, в котором используется настраиваемый адаптер синхронизации для синхронизации данных Google Task, привязанных к учетной записи Google, с использованием настраиваемого поставщика контента.

https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks

Демонстрационное приложение использует GoogleAuthUtil.getTokenWithNotification в OnPerformSync, но (теоретически) вы должны иметь возможность делать то же самое, используя AccountManager.getAuthToken для учетной записи, переданной в OnPerformSync.

Из документов Android AccountManager.getAuthToken:

Получает токен аутентификации указанного типа для определенной учетной записи, при необходимости вызывая уведомление, если пользователь должен ввести учетные данные. Этот метод предназначен для фоновых задач и служб, когда пользователь не должен быть немедленно прерван запросом пароля.

Если ранее сгенерированный токен аутентификации кэшируется для этой учетной записи и типа, он возвращается. В противном случае, если сохраненный пароль доступен, он отправляется на сервер для создания нового токена аутентификации. В противном случае возвращается Intent, который при запуске запрашивает у пользователя пароль. Если параметр notifyAuthFailure установлен, уведомление в строке состояния также создается с тем же намерением, предупреждая пользователя о том, что в какой-то момент ему необходимо ввести пароль.

person Sean    schedule 29.10.2014

Я предлагаю вам попытаться получить новый токен только в том случае, если вы обнаружите, что имеющийся у вас токен больше нельзя использовать. Этот подход следует предпочесть, так как тогда вы не жестко задаете срок действия токена в своем приложении.

Он также обрабатывает случаи, когда серверная сторона может время от времени аннулировать все токены по тем или иным причинам до истечения срока действия.

person Phuah Yee Keat    schedule 06.10.2015