web-dev-qa-db-ja.com

ウィジェットを動的に更新する方法(onUpdateが呼び出されるのを30分待たない)?

私は現在Androidのウィジェットについて学んでいます。

SSID、RSSI(信号)レベルを表示するWIFIウィジェットを作成したいと思います。

ただし、実行中のサービスからデータを送信して、wifi経由で音質を計算できるようにしたいです。

これが私がいくつかの読書と簡単なチュートリアルの後に持っているものです:


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 [〜#〜]

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が更新されることはありません。理由は何ですか。

[〜#〜]編集[〜#〜]

動作しました、ありがとうカラン

18
Donal Rafferty

次のコードを使用して、ウィジェットのデータを更新できます。

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

ウィジェットに関するドキュメント を見ると、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" >

これで、好きな期間を入れることができるはずですか? (更新は、呼び出しの直後には発生しない可能性があるため、できるだけ頻繁に更新する必要がありますが、バッテリーの世話をする必要があると記載されています)

2
Sephy