2010-05-28 9 views
15

Şu anda Android'deki widget'ları öğreniyorum.Bir Widget dinamik olarak nasıl güncellenir (OnUpdate'in çağrılması için 30 dakika beklemiyor)?

SSID'yi, RSSI (Sinyal) seviyesini görüntüleyecek bir WIFI widget'ı oluşturmak istiyorum.

Ayrıca, veriyi, Wifi üzerinden Ses Kalitesini hesaplayan bir hizmetten gönderebilmek istiyorum. İşte

bazı okuma ve hızlı bir öğretici sonra ne var:


public class WlanWidget extends AppWidgetProvider{ 

RemoteViews remoteViews; 
AppWidgetManager appWidgetManager; 
ComponentName thisWidget; 
WifiManager wifiManager; 

public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new WlanTimer(context, appWidgetManager), 1, 10000); 

} 


private class WlanTimer extends TimerTask{ 

     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 


public WlanTimer(Context context, AppWidgetManager appWidgetManager) { 

     this.appWidgetManager = appWidgetManager; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
     thisWidget = new ComponentName(context, WlanWidget.class); 
     wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 


} 

@Override 
public void run() { 

     remoteViews.setTextViewText(R.id.widget_textview, 
     wifiManager.getConnectionInfo().getSSID()); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
} 

} 

yukarıda Tamam çalışmak gibi widget'ta her 10 saniyede üzerinde SSID günceller.

Ancak, benim widget'ım üzerinde düzenli olarak güncellemek için halihazırda çalışmakta olan hizmetten bilgi almanın en etkili yolu nedir?

Ayrıca bir zamanlayıcı ve timertask kullanmak yerine widget'ı güncellemek için daha iyi bir yaklaşım var mı? Bu RSSI seviyesi değişimleri her koþulur


RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
ComponentName thisWidget = new ComponentName(context, WlanWidget.class); 
remoteViews.setTextViewText(R.id.widget_QCLevel, " " + qcPercentage); 
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, remoteViews); 

: Benim Hizmet aşağıdaki kodu eklemiş

Karan'ın öneri gereğince

GÜNCELLEME (yoklama kaçının) ama hala benim widget üzerinde TextView güncellemeyi, herhangi bir fikir neden? DÜZENLEME

o çalışma var teşekkürler Karan

+0

Bu benim çözümüm, widget'ı 30 dakikadan daha sık otomatik olarak nasıl güncellerim. AlarmManager'ı kullanıyorum: http://stackoverflow.com/questions/5476867/updating-app-widget-using-alarmmanager/#answer-14319020 – petrnohejl

cevap

23

Verileri güncellemek için aşağıdaki kodu kullanabilirsiniz. widget'ı:

ComponentName thisWidget = new ComponentName(getContext(), <ProviderClass>); 
AppWidgetManager.getInstance(getContext()).updateAppWidget(thisWidget, rempoteViews);
+0

Bunu hizmetime koyabilirim ve Widget’ı dinamik olarak günceller mi? –

+0

Hayır, bu güncelleştirmeyi tetiklemek için kullandığınız koddur (sorunun sonundaki 4 satırı kullandım). Bunu, widget'ım üzerindeki bir yenileme düğmesine beklemede olan bir niyet ekleyerek yaptım. Basıldığında, bu niyet özel bir eylem için bir yayın başlattı. Bu eylemi WidgetProvider'daki onReceive yönteminde yakaladım ve sonra bu kodu çalıştırdım. Harika çalışıyor! Teşekkürler! – RealCasually

1

Eğer documentation about widgets bakarsanız, size 2 güncellemeler arasında bir zamanı ayarlamak mümkün olması gerekiyordu:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="294dp" 
android:minHeight="72dp" 
android:updatePeriodMillis="86400000" 
android:initialLayout="@layout/example_appwidget" 
android:configure="com.example.android.ExampleAppWidgetConfigure" > 

Bununla, istediğiniz herhangi bir dönemi koyabiliyor olmalısınız? (Bu güncelleştirmenin doğrudan sizin aramanızdan sonra gerçekleşmeyeceğinden bahseder ve bu nedenle olabildiğince sık yapılmasını gerektirir, ancak pili dikkate almanız gerekir)

+6

1.6'dan itibaren OS'nin izin verdiği ve gerçekleştireceği minimum güncelleme, pil ömründen tasarruf etmek için 30 dakikadır . RSSI seviyesinin önemli ölçüde değiştiği her seferinde Widget'ı güncelleyebilmem gerekiyor, Wifi erişim noktası değişiyor ve servisimden hesaplanan QoS aşağıya iniyor veya belirli bir seviyenin üzerine çıkıyor. Tüm bunlar Widget'ta dinamik güncellemeye ihtiyaç duyar. –

İlgili konular