私は現在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が更新されることはありません。理由は何ですか。
[〜#〜]編集[〜#〜]
動作しました、ありがとうカラン
次のコードを使用して、ウィジェットのデータを更新できます。
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" >
これで、好きな期間を入れることができるはずですか? (更新は、呼び出しの直後には発生しない可能性があるため、できるだけ頻繁に更新する必要がありますが、バッテリーの世話をする必要があると記載されています)