Как использовать Android SyncAdapter? - PullRequest
51 голосов
/ 22 октября 2010

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

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"
/>

Ответы [ 3 ]

71 голосов
/ 02 марта 2011

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

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

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

  1. 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) в Authority.Запишите их в обратном порядке.Это иллюстрируется на их примере ... com.android.contacts.

5 голосов
/ 22 декабря 2010

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

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

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

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

2 голосов
/ 25 июня 2014

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

Оглядываясь назад на 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. Тип учетной записи и полномочия являются уникальными для вашего приложения..

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

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

Last userVisible true означает, что показан пользователю.

...