2010-12-12 14 views
8

Basit bir appwidget'im var ve bir etkinlikte (aynı uygulamada) bir eylem olduğunda bunu güncellemek istiyorum. onUpdate() 'de, hemen çalıştıran küçük parçayı güncelliyorum. Etkinliğimde, görünüm güncellemem için onUpdate() yönteminde çağrılan appwidget'imde aynı statik güncelleme yöntemini arıyorum. widget güncellenmez.android appwidget, etkinlikten güncellenmeyecek

Kodu doğrudan AppWidgetManager.updateAppWidget() yöntemine ve bu kadar iyi izleyebilirim, ancak widget güncellenmez.

Görebildiğim tek olası fark, bir etkinliğin bağlamından bir appwidget'ın onUpdate() yönteminin içeriğine göre çağrıldığında, statik nesne yöntemine geçirilen bağlam nesnesinin farklı olmasıdır. bununla birlikte, web üzerinde çok sayıda örnek var, bu yüzden çalışmasını bekliyorum.

cevap

19

Kodunuzu görmeden, bunu yapmaya çalıştığınızdan% 100 emin değilim, ancak kullandığım yöntem budur. Benim Activity içinde ben aşağıdaki yöntemi vardır: MyWidget appwidget sınıfıdır

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

. Tüm uygulama güncellememi güncellemek için Activity'umdaki her yerden bu yöntemi çağırabilirim.

+1

alıcı etiketlerinin içinde çağrı, bu yüzden sorun i güncellenmesi olmadığını olmalıdır doğru kimlik olduğu gibi, widget, etkinliğin aldığı id ile bir onclick niyetini kurar ve ardından widget'ın kendisini güncellemesini söyler. –

+0

OnUpdate yöntemini çağırmanın doğru yaklaşım olduğunu düşünmüyorum. AppWidgetManager.ACTION_APPWIDGET_UPDATE için bir yayın göndermelisiniz. – midhunhk

+0

@silverback "doğru bir şekilde yapıyor" yaklaşımından, size katılıyorum, bunu yapmanın doğru yolu bir yayın göndermektir. Bir "sadece işe yarar" yaklaşımından, yukarıdaki uygulama widget'larının güncellenmesine neden olacak - kirli ama işlevsel. –

9

Statik bir yöntem kullanmaktan ziyade, gereç zaten bir yayın alıcısı olduğundan ve bildiriminiz için bir güncelleme amacını kaydettiğinden yararlanın. Eğer aktivitesinden güncellemek gerektiğinde Sonra sadece

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

ve işlerin yapılmış Manifest'inizde dosyası

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

Bunu yapıyordum, ama ben onu değiştirdim, bu yüzden widget niyetli bir hizmet başlatıyor. niye ya? Widget, potansiyel olarak uzun süreli bir çalışma işlemini gerçekleştirir. onUpdate() hemen geri dönmediğinde widget'ında ANR elde ediyordum. Bu benim sorunum ile ilgili olduğundan emin değilim. –

+0

evet herhangi bir uzun operasyon IntentService, AsyncTask veya başka bir tip Threading kullanmalıdır. Buradaki cevabım, widget'ınızı, görevinizin tamamlandığını ve durumunu güncellemeye ihtiyaç duyduğunu bildirmek için görevini başlatması için gerekli olan süreyi -veya- öğrenmek için nasıl gideceğimi anlatmaktı. – schwiz

+0

@schwiz Uzun zaman önce ama yine de, uzun operasyonu gerçekleştirmek için onUpdate() 'da bir servis başlatmalısınız. Sanırım aldığım alıcı yaklaşık 5 saniye sürüyor. Bir AsyncTask oluşturmak, alıcının yok edilmesiyle de öldürüleceği için yetersizdir. – HGPB

İlgili konular