从后台接收器更新的小部件



我刚接触Android,所以每件简单的事情都像是一座大山。
我意识到一个应用程序(带有后台接收器)可以监听电话并做一些事情:这是有效的,好吧。我试图添加一个小部件(从接收器更新)显示一些状态,但这不起作用,小部件没有更新。

这是我的小部件的一部分:当它启动时,它显示正确的状态。

public class BlacklistWidget extends AppWidgetProvider {
    RemoteViews remote;
    ComponentName provider;
    Context context;
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        // create the remote view
        remote = new RemoteViews(context.getPackageName(), R.layout.widget);
        provider = new ComponentName(context, BlacklistWidget.class);
        this.context = context;
        Resources r = context.getResources();
        String[] usage_arr = r.getStringArray(R.array.pref_usage_array);
        int usage = Prefs.getUsage();
        Utils.Log("Widget onUpdate: " + usage);
        // remote.setImageViewResource(R.id.icon_usage,
        remote.setTextViewText(R.id.usage, usage_arr[usage]);
        appWidgetManager.updateAppWidget(provider, remote);
    }
}

当接收者改变静态类的状态时,调用这个方法:

public static void setUsage(int usage) {
    Usage = USAGE.values()[usage];
    try {
        Resources r = pcontext.getResources();
        String[] usage_arr = r.getStringArray(R.array.pref_usage_array);
        remoteViews.setTextViewText(R.id.usage, usage_arr[usage]);
        Utils.Log("Widget updated with " + usage);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

可以看到,用于更新小部件的代码与widget update()中包含的代码相同。
没有抛出异常,更新的文本发送是正确的。但是小部件TextView保持不变。

在manifest小部件中定义如下:

<receiver android:name=".BlacklistWidget" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/widget_info" />
</receiver>

我做错了什么?
有没有更好的方法来达到我的目标?
非常感谢。

您在setUsage中所做的事情不足以更新小部件:您必须在更新RemoteViews实例后调用updateAppWidget。当你调用Utils.Log("Widget updated with " + usage);时,你必须再次加载整个RemoteViews实例,设置所有适当的属性(包括你实际想要更新的文本视图),然后调用updateAppWidget

相关内容

最新更新