Widget de control de energía mostrado durante un breve momento al actualizar mi propio widget a través de AppWidgetManager, ¿cuál es el problema?

Tengo un problema al actualizar mi widget manualmente a través de AppWidgetManager.updateAppWidget. La plataforma es Android 2.2.

Aquí está el código:
He declarado el widget adicionalmente a una Actividad existente en el Manifiesto:

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

La widget-class fue declarada en Widget.java:

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

En la actividad existente agregué algunas líneas para actualizar manualmente el widget:

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

Pero ahora tengo este error: Si el widget está onClicked, muestra el widget energy-settings durante un corto período (~ 0,5sec-1sec) antes de que se muestre el widget deseado.

Aquí una captura de pantalla de este problema (secuencia de izquierda a derecha): http://i.stack.imgur.com/rHkjw.jpg

Primero hay el widget como en la imagen de la izquierda, luego cambia a la imagen del medio y se queda allí o cambia a la imagen de la derecha después de ~ 0,5-1sec.

Desafortunadamente no puedo ver ningún error en el código, ¿verdad?

Espero que pueda ayudarme a solucionar este problema;) Gracias de antemano, saludos, Oli

Tuve exactamente el mismo problema. Lo solucioné actualizando manualmente el widget NO a través de la difusión, pero llamando directamente AppWidgetManager.updateAppWidget (ComponentName, RemoteViews) en su lugar, desde una AsyncTask.

Intente esto dentro de su clase 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(); } 

A continuación, actualice llamando a Widget.updateWidget (this) de su actividad.

Utilicé la misma manera programática de actualizar manualmente el widget como usted lo hizo (de ¿Es posible lanzar una intención para APPWIDGET_UPDATE programmatically? ) Y encontró esto para ser la causa exacta del problema.

Esto todavía sucede en 4.2 y 2.3, oficial y no oficial ROMS (Touchwiz va absolutamente salvaje cuando esto sucede).

La única manera que podría arreglar esto era quitar la actualización entera que implicaba la difusión y actualizar el widget remotamente enviando una Broadcast regular al proveedor del widget y llamando

 ComponentName thisWidget = new ComponentName(context,AvailabilityWidgetProvider.class); AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views); 

Desde dentro onReceive

(Esto funciona para mí como los mis widgets son idénticos)

De esta manera, el problema parecía no ocurrir y podría actualizar el widget de forma remota. La vieja pregunta, lo sé, pero merece una respuesta, ya que era todo lo que podía encontrar en este extraño problema.

  • SetImageViewBitmap no funciona en el widget android
  • ¿Hay alguna manera de poner un campo EditText / entrada en un widget homescreen?
  • Widget de Android que parece exactamente un icono de lanzador
  • El widget de Android no puede recibir el mensaje DATE_CHANGED
  • Android Widget deja de funcionar aleatoriamente
  • Recursos android de escala automática
  • ¿Cómo puedo agregar un nuevo botón en el widget del selector de fechas en android?
  • Cómo tener acceso a un elemento TextView en un BroadcastReceiver
  • ¿Cómo agregar un botón a las notificaciones en android?
  • El widget de búsqueda no está funcionando en el release apk
  • Android widget ¿cómo puede obtener el tiempo en hora y minuto de esto?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.