2010-10-22 9 views
51

Я пытаюсь понять логику синхронизации Android. То, что я не понимаю, - это файл syncadapter.xml, содержащийся в образце проекта SDK для Android SampleSyncAdapter. Если вы загрузили примеры SDK он должен быть в следующей папке:Как использовать Android SyncAdapter?

SDK/android-sdk-PLATFORM/samples/android-VERSION/SampleSyncAdapter/res/xml/syncadapter.xml 

Я прочитал, авторитет поставщика контента должен быть строкой или ссылка на ресурс. Что такое орган контента и где находится com.android.contacts? Вот содержимое файла (без информации о лицензии и комментариев, API-уровень 16).

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.contacts" 
    android:accountType="com.example.android.samplesync" 
    android:supportsUploading="false" 
    android:userVisible="true" 
/> 
+1

Пожалуйста, прочитайте ** статьи ** и ознакомьтесь с ** примерами проектов **, упомянутыми в [этом сообщении] (http://stackoverflow.com/questions/1859241/own-sync-adapter-for-android/ 7795266). Один из примеров относится к приложению last.fm, а также относится к настройкам «android: contentAuthority». – JJD

ответ

4

Когда ваш APK загружается, директивы в манифесте сообщают ОС, чтобы просмотреть все метаданные. В этом случае это метаданные контента для контактов Android. Имя, которое используется для поиска провайдера, - com.android.contacts (определено Android) - и владелец имеет «полномочия» для предоставления доступа к содержимому своей базы данных (то есть ContentProvider).

N.B. Вы можете быть поставщиком контента ваших собственных данных, которые могут быть синхронизированы с вашими веб-службами, которые не являются контактами. Метаданные - это механизм регистрации в ОС, чтобы вы могли найти его во время широковещательного сообщения.

Эти определенные метаданные будут связаны с вашим SyncAdapter в силу используемого вами типа синхронизации. Имя типа - андроид: accountType и может быть «com.mycompany.myapp». Этот ключ используется во время трансляции для всех адаптеров синхронизации, и ваш кодированный BroadcastReceiver будет обрабатывать сообщение с вашим типом.

Это начало отношений и некоторая разбивка терминологии.

+0

Как система Android знает, что должна выполняться синхронизация. Где запрашивается синхронизация? – siamii

+4

Есть несколько настроек по умолчанию, которые вы можете включить, и вы можете определить свои собственные намерения «синхронизировать сейчас» (намерения). Чтобы синхронизировать - теперь вы можете «ContentResolver.requestSync (учетная запись, полномочия, дополнительные функции)»; (проверьте SO вопрос http://stackoverflow.com/questions/4465765/how-to-code-a-sync-now-operation-on-android). Модель адаптера синхронизации поддерживает периодическую синхронизацию, {AlarmManager.INTERVAL_DAY | INTERVAL_HALF_DAY | INTERVAL_FIFTEEN_MINUTES | и т.д.}. Кроме того, модель будет повторно синхронизироваться, если в ходе активной синхронизации были ошибки. – mobibob

70

Есть два основных способа, которые можно использовать при создании SyncAdapter:

  1. Заполните данные в существующую ContentProvider.
  2. Создайте свой собственный ContentProvider для хранения нового типа данных.

Первое, что происходит в этом примере приложения. У них есть веб-сайт, на котором есть список контактов, и они хотят хранить их вместе с другими контактами на устройстве. В любом случае способ, которым все это работает, заключается в соотношении между тремя компонентами:

  1. A ContentProvider, в котором хранятся данные.
  2. SyncAdapter, который связывается с удаленным сервером для получения данных для размещения в ContentProvider.
  3. Android ContentResolver, в котором показано, как скомпилировать SyncAdapters и ContentProviders.

Устройство Android может иметь множество разных ContentProviders и множество разных SyncAdapters. Поскольку ContentResolver не может быть частью того же .apk как SyncAdapter, ContentResolver - это системная служба, которая находит правильный ContentProvider для хранения данных определенного типа. Он делает это, используя строку ContentAuthority, которая однозначно идентифицирует один конкретный ContentProvider. Кроме того, каждый ContentProvider должен быть объявлен в AndroidManifest.xml, который гарантирует, что его можно найти в ContentResolver.Внутри этой декларации вы можете указать, может ли ContentProvider использоваться другими приложениями, см .: android:exported.

<provider 
    android:name=".CustomProvider" 
    android:authorities="com.example.app.provider" 
    android:exported="false" 
    android:multiprocess="true" > 
</provider> 

В этом случае, используя существующий ContentProvider, вам нужно будет смотреть на документацию платформы, чтобы увидеть, что строка ContentAuthority они используют, и использовать ту же строку. Если вы создаете свой собственный ContentProvider, вам просто нужно убедиться, что созданный вами ContentAuthority уникален. Лучший способ сделать это - использовать части вашего доменного имени (стиль класса java) в Органе. Напишите их в обратном порядке. Это проиллюстрировано в их примере ... com.android.contacts.

1

Это способ создать связь между учетной записью типа, синхронизации адаптера и Content Authority

Оглядываясь назад снова AndroidManifest, что странно тег мета-данных в службе синхронизации является ключевым элементом, который устанавливает связывание между ContentAuthority и учетной записью. Он внешне ссылается на другой файл XML (называйте, как вам нравится, то отношение к вашему приложению.)

Давайте посмотрим на sync_myapp.xml:

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.contacts" 
    android:accountType="com.example.android.samplesync" 
    android:supportsUploading="false" 
    android:userVisible="true" /> 

Он говорит, что Android синхронизации адаптер мы определили (класс, который был вызван в элементе имени тега, который включает тег, который включает этот файл, синхронизирует контакты, используя учетную запись стиля com.example.android.samplesync. Тип учетной записи и полномочия уникальны для вашей заявки.

Весь ваш контент. Строки привязки должны соответствовать всем и соответствовать тому, что вы синхронизируете. Это должна быть строка y ou define, если вы создаете свою собственную базу данных или используете некоторые существующие строки устройств, если вы синхронизируете известные типы данных (например, контакты или события календаря или какие у вас есть). Вышеупомянутые («com.android.contacts»)) является строкой ContentAuthority для данных типа контактов (сюрприз, сюрприз).

Учетная запись accountType также должна соответствовать одному из этих известных типов учетных записей, которые уже введены, или он должен соответствовать тому, который вы создаете.

Последний пользовательВыберите истинные средства, показанные пользователю.

Смежные вопросы