代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

如何动态更新小部件(不等待30分钟调用OnUpdate)?

  •  18
  • Donal Rafferty  · 技术社区  · 14 年前

    我目前正在学习Android中的小工具。

    我想创建一个wifi小部件,显示ssid,rssi(信号)级别。

    但我也希望能够从我运行的一个计算WiFi声音质量的服务发送IT数据。

    以下是我在阅读和快速教程之后得到的:


    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);
    }
    
    }
    

    上面的工作似乎正常,它每10秒更新一次小部件上的ssid。

    但是,从我的服务中获取信息的最有效方法是什么?这些信息已经在运行,以便在我的小部件上定期更新?

    还有没有更好的方法来更新小部件,而不是使用计时器和计时器任务?(避免轮询)

    更新

    根据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,有什么想法吗?

    编辑

    好了,谢谢卡兰

    2 回复  |  直到 14 年前
        1
  •  24
  •   Karan    14 年前

    您可以使用以下代码更新小部件的数据:

    ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
    AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );
        2
  •  2
  •   Sephy    14 年前

    如果你看 documentation about widgets ,您应该能够设置两次更新之间的时间:

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

    有了这个,你应该可以放任何你想要的时间? (它提到,更新可能不会在您呼叫后直接发生,因此您必须尽可能频繁地进行更新,但您必须注意电池)