Как динамически обновить виджет (не дожидаясь 30 минут для вызова onUpdate)? - PullRequest
18 голосов
/ 28 мая 2010

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

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

Но я также хочу иметь возможность отправлять ему данные из службы, которую я использую, которая рассчитывает качество звука по 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 секунд.

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

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

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 на моем виджете, есть идеи, почему?

EDIT

Получилось, спасибо Каран

Ответы [ 2 ]

24 голосов
/ 28 мая 2010

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

ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );
2 голосов
/ 28 мая 2010

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

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

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

...