SORU
9 Mart 2011, ÇARŞAMBA


Neden ContentResolver.requestSync bir senkron tetik değil mi?

Google IO - slayt 26 de tartışıldığı gibi-İçerik Sağlayıcı-Sync Adaptörü desen kullanmaya çalışıyorum. İçerik sağlayıcısı çalışıyor, ve benim sync Dev Araçları Senkronize Tester ContentResolver aradığımda, ancak uygulama ben tetiği çalışır.benim ContentProvider, benim senkronize requestSync(hesap, yetki, paket) hiçbir zaman tetiklenir.

ContentResolver.requestSync(
        account, 
        AUTHORITY, 
        new Bundle());

Edit -- eklendi bildirim Pasajı Bildirim benim xml içerir:

<service
    android:name=".sync.SyncService"
    android:exported="true">
    <intent-filter>
        <action
            android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapter"
    android:resource="@xml/syncadapter" />
</service>

--Edit

Benim syncadapter.xml içerir: senkronizasyon hizmeti ile ilişkili

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"  
    android:contentAuthority="AUTHORITY"
    android:accountType="myaccounttype"
    android:supportsUploading="true"
/>

Diğer kod yararlı olacağını emin değilim. Hesabı requestSync geçti "" ve YETKİYE çağrısına geçilen benim syc adaptör xml. maçlar myaccounttype olur

ContentResolver.bir eşitleme isteği için doğru şekilde requestSync? Hizmet sync test aracı bağlar gibi doğrudan görünüyor ve çağrıları senkronize başlar, ama bu sync mimarisi entegre bir anlamı kalmıyor gibi görünüyor.

Eğer bir eşitleme isteği için doğru yolu neden sync test işe yarar o zaman, ama benim ContentResolver için arayın.requestSync? Paket geçmem gereken bir şey var mı?

Cihazlar 2.1 ve 2.2 üzerinde çalışan bu yazılımı test ediyorum.

Yardımlarınız için şimdiden teşekkürler
--Ben

CEVAP
10 Mart 2011, PERŞEMBE


() RequestSync sadece sistem için bilinen (Hesap, ContentAuthority} bir çift üzerinde çalışacak. App içeriği belirli bir tür hesap belirli bir tür kullanarak senkronize etme yeteneğine sahip olduğunuz Android söylemek için bir dizi adım geçmesi gerekiyor. Bu AndroidManifest bu.

1. Uygulama paketleri senkronizasyonu sağlayan Android ediniz

Öncelikle, androidmanifest.xml Senkronize bir Hizmet olduğunu beyan etmek gerekiyor

<service android:name=".sync.mySyncService" android:exported="true">
   <intent-filter>
      <action android:name="android.content.SyncAdapter" /> 
    </intent-filter>
    <meta-data 
        android:name="android.content.SyncAdapter" 
        android:resource="@xml/sync_myapp" /> 
</service>

adı sınıf adı sync bağlamak için... bir saniye sonra konuşacağım.

verilen diğer bileşenleri (yani ContentResolver arayabilir gerekli) görünür yapar.

Niyet filtre hedefi sync isteyen yakalamasına izin vermez. (Bu niyeti RequestSync aradığınızda ContentResolver geliyor() işlevi.)

2. Android bir servis SyncAdapter bulmak için kullanılan sağlar

Sınıfın kendisi... İşte bir örnek:

public class mySyncService extends Service {

    private static mySyncAdapter mSyncAdapter = null;

    public SyncService() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        if (mSyncAdapter == null) {
            mSyncAdapter = new mySyncAdapter(getApplicationContext(), true);
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mSyncAdapter.getSyncAdapterBinder();
    }
}

Sizin sınıf Hizmet genişletmelidir. Sınıfınızın gerekir deposu bir üye değişkenin türü AbstractThreadedSyncAdapter, uygulamak gerekir public IBinder onBind(Intent) ve gerek dönüş SyncAdapterBinder zaman onun adı... Yani gördüğünüz gibi, hemen hemen her şeyi bu sınıf. Orada tek sebebi Android için standart bir arayüz SyncAdapter kendini ne olarak sınıfınızı sorgulamak için sunduğu bir Hizmet sağlamaktır.

3. class SyncAdapter aslında eşitleme gerçekleştirmek için sağlar.

mySyncAdapter saklı kendisi olduğu yerdir. Senkron zaman (onPerformSync() çağrılır) alır. Zaten bu olduğunu düşünüyorum.

4. Hesap türü ve İçeriği bir Otorite arasında bir bağ kurmak

Tekrar AndroidManifest, bizim hizmet içinde meta-veri etiketi garip bakıyor bir ContentAuthority ve hesap arasındaki bağı kuran bir anahtar parça. Bu dosya xml başka bir harici referanslar (sizin gibi ne olursa olsun, bir şey uygulamanıza alakalı arama.) Hadi sync_myapp.xml bak:

<?xml version="1.0" encoding="utf-8" ?> 
<sync-adapter 
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:contentAuthority="com.android.contacts"
    android:accountType="com.google" 
    android:userVisible="true" /> 

Tamam, bu tam olarak ne yapıyor? Söyler Android sync adaptörü ettik tanımlı (sınıf oldu diye seslendi adı öğe <service> etiketi içeren <metadata> etiketi içeren bu dosya...) senkronize kişileri kullanarak bir com.google tarzı hesap.

Tüm contentAuthority dizeleri için tüm maç ve MAÇ ne sen senkronize -- Bu olmalı bir ip tanımlayın, eğer sen oluşturma Kendi veritabanı var, ya da sen kullan varolan bazı cihaz dizeleri eğer senkronize bilinen veri türleri (gibi kişiler veya takvim olayları veya ne var.) Yukarıda ("com.android.") kayıtlar bir tür veri (sürpriz, sürpriz!) için ContentAuthority dize olur

accountType da maç bir tane bilinen hesap türleri, önceden giren veya bu maçı sensin oluşturma (Bu içerir oluşturma Bir alt AccountAuthenticator almak auth sunucunuz... Bir makale değerinde kendisi.) Yine, "com.google"... google.com tanımlanan string tanımlama tarzıdır kimlik bilgilerini (yine, bu sürpriz olmamalı.) hesap

5. / ContentAuthority çifti, belirli bir Hesap Sync etkinleştirin

Son olarak, eşitleme etkin olmalı. Uygulamanız için uygulamanın yanındaki onay kutusunu eşleşen hesabı içinde ayarlayarak Hesaplar Ve Senkronizasyon sayfa Kontrol Panelinde yapabilirsiniz. Alternatif olarak, app bazı Kur kodu olabilir

ContentResolver.setSyncAutomatically(account, AUTHORITY, true);

Ortaya eşitlemek için, hesap/yetkilisi çifti sync (yukarıdaki gibi) için etkinleştirilmiş olması gerekirvesistemde genel olarak küresel sync bayrağı ayarlanmış olması gerekirvecihazın ağ bağlantısı olması gerekir.

Eğer hesabınız/yetki senkronizasyonu veya küresel eşitleme devre dışı bırakılırsa, arama RequestSync() var bir etkisi -- ayarlar bir bayrak senkronize edilmiş istenen ve gerçekleştirilebilir olarak senkronize etkin.

Ayrıca, başına mgv ayar ContentResolver.SYNC_EXTRAS_MANUAL gerçek figüranlar paket sizin requestSync sormak android için güç bir senkronizasyon bile küresel sync off (saygılı ol senin kullanıcı burada!)

Son olarak, periyodik zamanlanmış eşitleme Kur, ContentResolver fonksiyonları ile tekrar edebilirsiniz.

6. Birden fazla hesap sonuçları göz önünde bulundurun

O an için birden fazla hesabı aynı tip (iki @gmail.com hesapları ayarlanmış bir aygıt ya da iki facebook hesabı, ya da iki twitter hesapları, vb.) dikkate almanız gereken uygulama etkileri yapıyor... Eğer iki hesap, muhtemelen istemiyorum denemek sync ikisini de aynı veritabanı tabloları. Belki de tek bir seferde aktif olabilir, ve tablolar floş belirtin ve eğer hesapları geçerseniz ~ gerekir. (var olduğunu sorgulayan bir özellik sayfası üzerinden). Belki de her hesabın, belki de farklı bir tablo, farklı bir veritabanı oluşturmak, her tablonun anahtar sütunu belki. Tüm uygulama ve bazı düşünce belirli layık. ContentResolver.setIsSyncable(Account account, String authority, int syncable) burada ilgi olabilir. () setSyncAutomatically hesap/otorite bir çift olup olmadığını kontrol ederkontrol ettiyadenetlenmeyen, setİsSyncable ise() bir şekilde temizleyin ve kullanıcı açın. bu yüzden çizgi gri sağlar. Bir hesap Syncable değil, diğer Syncable () dsabled ayarlayabilirsiniz.

7. ContentResolver farkında olun.() notifyChange

Bir püf nokta. ContentResolver.() notifyChange bir işlevi ContentProviders ile bildirmek için kullanılan yerel veritabanı değiştirildi Android. Bu hizmet iki işlev, ilk, neden olur imleçler şu contenturi güncelleme, ve sırayla yeniden sorgulamak ve geçersiz ve yeniden bir liste Görünümü, vb... çok büyülü, veritabanı değişiklikleri ve Liste Görünümü sadece otomatik olarak güncellenir. Harika. Veritabanı değiştiğinde de, bu değişikliklerin Android cihaz çıkarmış olsun ki normal programınıza dışarı bile senin için Eşitleme isteği, ve sunucu için mümkün olduğunca hızlı bir şekilde senkronize. Ayrıca harika.

Bir kenarı dava var. Eğer çekersen sunucu ve itin bir güncelleme içine ContentProvider olacak aldatılan çağrı notifyChange() ve android edecek, "Oh, veritabanı değişiklikleri, daha iyi bir tane sunucu!" (Doh!) İyi yazılmış ContentProviders bazı testler değişiklikleri ağ ya da kullanıcı geldi, ve bu yüzden, bu savurgan çift sync önlemek için boolean syncToNetwork bayrağı false olarak ayarlanmış olmadığını görmek gerekir. Eğer bir ContentProvider veri besleme iseniz, her zaman bir ihtiyaç olduğunda iki eşitler sahne bitireceğiz. Aksi takdirde bu çalışma almak için nasıl anlamaya sağlıyordu.

8. Mutlu hissediyorum!

Tüm bu xml meta veri ve eşitleme etkin bir defa, Android sizin için her şeyi bağlamak için nasıl bilecek, ve senkronize çalışmaya başlamalı. Bu noktada, güzel olan birçok şey sadece yere tıklayın ve tıpkı büyü gibi hissedeceksiniz. Tadını çıkarın!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006
  • WiseOwlTutorials

    WiseOwlTutor

    21 EKİM 2011