Как обновить Виджет динамично (Не ожидающий 30 минут onUpdate, который назовут)?

Я в настоящее время узнаю о виджетах в Android.

Я хочу создать виджет WI-FI, который отобразит 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 секунд.

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

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

ОБНОВЛЕНИЕ

Согласно предложению Karan я добавил следующий код в своем Сервисе:


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 спасибо

18
задан Donal Rafferty 28 May 2010 в 15:50
поделиться

2 ответа

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

ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );
24
ответ дан 30 November 2019 в 08:26
поделиться

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

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

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

2
ответ дан 30 November 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: