通过AppWidgetManager更新我自己的小部件时显示的电源控制小部件,有什么问题?

时间:2011-01-07 01:38:24

标签: android controls widget

我通过AppWidgetManager.updateAppWidget手动更新我的小部件时遇到了问题。 平台是Android 2.2。

以下是代码:
我将小部件声明为Manifest中的现有Activity:

<receiver android:name=".Widget" 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" />
</receiver>

在Widget.java中声明了widget类:

public class Widget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    int use_static_ip;
    RemoteViews remoteViews;

    try {
        use_static_ip = Settings.System.getInt(context.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP);
        if (use_static_ip == 0) { //DHCP
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_dhcp);
        } else { //static IP
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_static);
        }
        Intent call_activity = new Intent(context, StaticIPToggle.class);
        PendingIntent pending_call_activity = PendingIntent.getActivity(context, 0, call_activity, 0);
        remoteViews.setOnClickPendingIntent(R.id.widget_icon, pending_call_activity);
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    } catch (SettingNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

在现有活动中,我添加了一些行来手动更新小部件:

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
        ComponentName componentName = new ComponentName(getApplicationContext(), Widget.class);
        int[] ids = appWidgetManager.getAppWidgetIds(componentName);
        Intent update_widget = new Intent();
        update_widget.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
        update_widget.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        getApplicationContext().sendBroadcast(update_widget);

但现在我有这个错误: 如果窗口小部件是onClicked,它会在显示所需窗口小部件之前的短时间内(~0.5秒-1秒)显示energy-settings-widget。

此问题的屏幕截图(从左到右的顺序):http://i.stack.imgur.com/rHkjw.jpg

首先是左侧图片中的小部件,然后更改为中间图片并保持在那里或在~0,5-1秒之后更改为右图片。

不幸的是我在代码中看不到任何错误,是吗?

希望你能帮助我解决这个问题;) 提前致谢, 问候,Oli

2 个答案:

答案 0 :(得分:0)

我有完全相同的问题。我通过手动更新窗口小部件而不是通过广播来解决它,而是直接从AsyncTask调用AppWidgetManager.updateAppWidget(ComponentName, RemoteViews)

在你的Widget类中试试这个:

/**
 * Asynchronously builds views and updates the widget.
 */
private static class UpdateWidgetTask extends AsyncTask<Void, Void, RemoteViews> {
    private AppWidgetManager mAppWidgetManager;
    private Context mContext;

    private UpdateWidgetTask(AppWidgetManager appWidgetManager, Context context) {
        mAppWidgetManager = appWidgetManager;
        mContext = context;
    }

    @Override
    protected RemoteViews doInBackground(Void... params) {
        DebugLog.d(TAG, "Asynchronously updating widget.");
        RemoteViews views = buildUpdate(mContext);
        return views;
    }

    @Override
    protected void onPostExecute(RemoteViews views) {
        ComponentName thisWidget = new ComponentName(mContext, Widget.class);
        mAppWidgetManager.updateAppWidget(thisWidget, views);
    }
}

/**
 * Asynchronously updates all widgets of this type. This is the fastest way to update the widget.
 *
 * @param context The context.
 */
public static void updateWidget(Context context) {
    new UpdateWidgetTask(AppWidgetManager.getInstance(context), context).execute();
}

然后通过从您的活动中调用Widget.updateWidget(this)进行更新。

答案 1 :(得分:0)

我使用相同的程序方式手动更新小部件(来自Is it possible to throw an intent for APPWIDGET_UPDATE programmatically?)并发现这是问题的确切原因。

这仍然发生在4.2和2.3,官方和非官方ROMS上(Touchwiz在发生这种情况时非常疯狂)。

解决这个问题的唯一方法是删除涉及广播的整个更新,并通过向Widget Provider发送常规Broadcast并调用

来远程更新小部件
ComponentName thisWidget = new ComponentName(context,AvailabilityWidgetProvider.class);
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views);

来自onReceive

(这适用于我,因为我的小部件是相同的)

这样,问题似乎没有发生,我可以远程更新小部件。 老问题,我知道,但值得回答,因为这是我在这个奇怪的问题上能找到的全部内容。