Подтвердить что ты не робот

Как использовать Android SyncAdapter?

Я пытаюсь понять логику синхронизации Android. То, что я не понимаю, это файл syncadapter.xml, содержащийся в образце проекта SDK для Android 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"
/>
4b9b3361

Ответ 1

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

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

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

  • ContentProvider, в котором хранятся данные.
  • SyncAdapter, который связывается с удаленным сервером для получения данных для размещения в ContentProvider.
  • 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.

Ответ 2

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

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

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

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

Ответ 3

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

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

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