2013-12-11 24 views
6

Bazen güncellenmeyen bir DashClockExtension sahibim.Dashclock Widget eklentisi güncellenmiyor

http://bit.ly/1e4uMl0'a benzer uzantıyı güncellemek için LocalBroadcastReceiver kullanıyor. Alıcı onInitialize() yöntemde kayıtlıdır:

public static void updateDashClock() { 
    LocalBroadcastManager.getInstance(Application.getContext()).sendBroadcast(new Intent(UPDATE_DASHCLOCK)); 
}   

benim BroadcastReceiver var: Ben yayın gönder nasıl

@Override 
    protected void onInitialize(boolean isReconnect) { 
     super.onInitialize(isReconnect); 

     LocalBroadcastManager broadcastMgr = LocalBroadcastManager.getInstance(this); 
     if (mDashClockReceiver != null) { 
      try { 
       broadcastMgr.unregisterReceiver(mDashClockReceiver); 
      } catch (Exception ignore) {} 
     } 
     mDashClockReceiver = new DashClockUpdateReceiver(); 
     broadcastMgr.registerReceiver(mDashClockReceiver, new IntentFilter(UPDATE_DASHCLOCK)); 
    } 

fark ettim

private class DashClockUpdateReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     retrieveDataAndUpdateWidget(); 
    } 
} 

o yayın tetiklenir iken alıcı bazen olayı almaz.
Uygulamamı öldürerek test ettim, ancak bu sorunu yeniden üretmiyor, bu yüzden bunun neden bir kayıp olacağını görüyorum.

Herkes?

+0

Daha fazla kod gönderir misiniz? Verileri tam olarak nasıl güncellemeye çalışıyorsunuz? PublishUpdate başarısız olursa, publishUpdate (null) –

+0

'u aramadıkça eski veriler hala kalır. Sorun, güncelleme kodunun kendisi değil, yayınların yayın alıcısı tarafından alınmadığı gerçeğidir. Genellikle iyi çalışıyor ama "bazen" yapmıyor ve neden olmasını ve bunu önlemek için neler yapabileceğimi bilmek isterim. Öncelikle uygulamanın kapatıldığı zaman servisin DashClock widget'ının kendisi tarafından tekrar bağlanmayacağını ve BroadcastReceiver'ın kaydedilmeyeceğini düşündüm ama bu durum böyle değil. Servis başlar ve widget ile sıkı sıkıya bağlıdır. –

cevap

1

, bazı istenmeyen yan etkileri vardır. Bu yüzden hiçbir yan etkisi olmayan daha iyi bir çözüm buldum.

talimat DashClockWidget addWatchContentUris kullanarak belli Uri gözlemlemek ve widget'ı güncellemek için zamanı geldiğinde o zaman sadece o Uri üzerinde NotifyChange çağırmak için:

public class DashClockService extends DashClockExtension { 
    private static final Uri URI_BASE = Uri.parse("content://com.myauthority"); 
    private static final String URI_PATH_SEGMENT = "dashclock/update"; 

    public static void updateWidget(Context context) { 
     ContentResolver contentResolver = context.getContentResolver(); 
     Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT); 
     contentResolver.notifyChange(uri, null); 
    } 

    @Override 
    protected void onInitialize(boolean isReconnect) { 
     super.onInitialize(isReconnect); 

     removeAllWatchContentUris(); 
     Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT); 
     addWatchContentUris(new String[] {uri.toString()}); 
    } 

updateWidget widget'ı güncellemek için kodunda her yerden çağrılabilir. En önemlisi, uygulama başladığında çağrılabilir, ör. Android tarafından öldürüldükten ve yeniden başlatıldıktan sonra (Application.onCreate() içindeki güncellemeyi arıyorum).

2

Lütfen GCM yayın alıcısının Google's GCM Client example sürümünde nasıl uygulandığına bakın. Bu, daha fazla belleğe (veya herhangi bir nedenden) ihtiyaç duyduğu için 'unuz olabilir ve daha sonra yayın alıcınızdaki yayınları almazsınız.

Umarım, bazı günlükler ve daha fazla bilgi veriniz.

Şansın en iyisi!

+0

BroadcastReceiver'ın bir üye sınıfı olması gerektiğinden dinamik olarak kaydedilmesi gerekiyor veya publishUpdate (ExtensionData) (bir Hizmet olan bir DashClockExtension yöntemi) olarak adlandırılamayacağız. Ayrıca bkz: http://stackoverflow.com/a/15571547/534471). Bildiride tanımlı bir BroadcastReceiver'a sahip olmak yayınımızı almamıza izin verecek, ancak yayınlamayı güncellememiz mümkün olmadı, çünkü publishUpdate (ExtensionData) çağrısı yapmanın bir yolu yok. –

1

kapsamlı testler çalıştırdıktan sonra, ben de diğer geliştiriciler öğrenmenin ilginç olabilir bazı sonuçlar var: Android uygulamasını öldürmek için uygulama Android tarafından öldürülünce

  • Gerçekten olur (ı beklemedi ancak elle elle öldürdü)
  • DashClock Widget bir süre sonra hizmeti tekrar bağlar. Tahminimce, saatte bir kez (DashClockExtension javadoc'a göre) zamanlanmış ui güncellemesini çalıştırdığında servisi tekrar bağlar. Kaynak koddan geçerek tahmin etmeyi onayladım. Bu nedenle, uzantı eninde sonunda güncellenir, ancak yalnızca düzenli güncelleme döngüsü çalıştırıldıktan sonra bir saat kadar gerçekleşmeyebilir. İşte

benim geçici çözüm var: devre dışı bırakma ve DashClockExtension hizmetini ne zaman yeniden etkinleştirerek tüm DashClockExtensions (ACTION_EXTENSION niyet filtreli servisi)

  • bulmak için

    Ben hizmetini etkinleştirmek, devre dışı edebilirsiniz: İlk yanıtım çalışsa da

    configureComponent("mypackagename.DashClockService", false); // disable 
    configureComponent("mypackagename.DashClockService", true); // enable 
    
    private void configureComponent(Context context, String className, boolean enable) { 
        PackageManager pkMgr = context.getPackageManager(); 
        String packageName = context.getPackageName(); 
        ComponentName component = new ComponentName(packageName, className); 
        int newState = enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 
        pkMgr.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP); 
    } 
    
  • +0

    Bu çözüm, Samsung cihazlarında servisin etkinleştirilmesini ve devre dışı bırakılmasının istenmeyen yan etkilere neden olmasına rağmen. Kısayollar örn. özel simge ve/veya açıklamalarını kaybedebilir (uygulama simgesine ve adına geri döner). Ancak, uygulamanın çökmesinden sonra DashClockWidget'e yeniden bağlanmanın daha iyi bir yolunu buldum (yeni cevabımı görün). –