Don*_*rty 18 android widget dynamic
我目前正在学习Android中的小部件.
我想创建一个WIFI小部件,它将显示SSID,即RSSI(信号)级别.
但我也希望能够从我正在运行的服务中发送数据,通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
以上似乎工作正常,它每10秒更新一次小部件上的SSID.
但是,从我的服务中获取信息的最有效方法是什么,这些信息已经在我的小部件上定期更新?
还有更好的方法来更新小部件而不是使用计时器和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 );
Run Code Online (Sandbox Code Playgroud)
这会在每次RSSI级别更改时运行,但它仍然永远不会更新我的小部件上的TextView,任何想法为什么?
编辑
得到了它,谢谢Karan
Kar*_*ran 24
您可以使用以下代码更新小部件的数据:
ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33397 次 |
| 最近记录: |