Как обновить виджет динамически (не ждать 30 минут для вызова onUpdate)?

В настоящее время я изучаю виджеты в Android.

Я хочу создать виджет WIFI, который отобразит SSID, уровень RSSI (Signal).

Но я также хочу иметь возможность отправлять данные из службы, которую я запускаю, которая вычисляет качество звука через Wi-Fi.

Вот что я получил после некоторого чтения и быстрого учебника:


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);
}

}

Выше, кажется, работает нормально, он обновляет SSID в виджет каждые 10 секунд.

Однако каков наиболее эффективный способ получить информацию из моей службы, которая уже будет выполняться для периодического обновления моего виджета?

Также есть лучший подход к обновлению виджета, а не к использованию таймера и timertask? (Избегайте опроса)

UPDATE

В соответствии с предложением Карана я добавил в свой код следующий код:


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 );

Это запускается каждый раз, когда изменяется уровень RSSI, но он по-прежнему никогда не обновляет TextView на моем виджете, любые идеи, почему?

ИЗМЕНИТЬ

Получил работу, спасибо Karan

Ответы

Ответ 1

Вы можете использовать следующий код для обновления данных виджета:

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

Ответ 2

Если вы посмотрите документацию о виджетах, вы должны установить время между двумя обновлениями:

<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" >

С этим вы сможете уложить любой период, который вы хотите? (Он упоминает, что обновление может не произойти сразу после вашего вызова для него, и, следовательно, сделать это как можно чаще, но вы должны заботиться о батарее)