2011-01-07 2 views
8

Ich habe ein Problem, wenn ich mein Widget manuell über AppWidgetManager.updateAppWidget aktualisiere. Plattform ist Android 2.2.Power-Control-Widget für einen kurzen Moment angezeigt, wenn mein eigenes Widget über AppWidgetManager aktualisiert, was ist das Problem?

Hier ist der Code:
ich das Widget erklärte zusätzlich zu einer bestehenden Aktivität im Manifest:

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

Die Widget-Klasse in Widget.java erklärt wurde:

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

In der vorhandenen Aktivität habe ich einige Zeilen hinzugefügt, um das Widget manuell zu aktualisieren:

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

Aber jetzt habe ich diesen Fehler: Wenn das Widget onClicked ist, zeigt es die Energie-Einstellungen-Widget für einen kurzen Zeitraum (~ 0,5sec-1sec), bevor das gewünschte Widget angezeigt wird.

Hier ein Screenshot dieser Ausgabe (Sequenz von links nach rechts): http://i.stack.imgur.com/rHkjw.jpg

Zuerst gibt es das Widget wie im linken Bild, dann auf das mittlere Bild ändert und entweder dort bleibt oder Änderungen an die rechten Bild nach ~ 0,5-1sek.

Leider kann ich im Code keinen Fehler sehen, oder?

Hoffentlich können Sie mir helfen, dieses Problem zu beheben;) Vielen Dank im Voraus, Grüße, Oli

+0

Wow, ich habe das gleiche Problem; Gut zu sehen, dass es nicht nur ich ist, es ist ein schwieriges Thema zu beschreiben. Ich bekomme den Bug mit einem HTC EVO 4G, auf dem ein benutzerdefiniertes 2.2 ROM läuft, aber nicht im Emulator. Das Problem tritt auch nicht bei einem Samsung Galaxy S auf. Hat jemand da draußen eine Lösung? Ich habe mich eine Weile mit diesem Problem herumgeschlagen. – Bobby

+0

Ich habe das gesehen, indem ich das scrollablecontacts-Widget mit den Quellen [hier] (http://code.google.com/p/scrollablecontacts/) in einem benutzerdefinierten Startprogramm getestet habe, in dem versucht wurde, das Widget für viele Kontakte hinzuzufügen. Es kann damit zu tun haben, dass der Code zu lange dauert, um den Widget-Inhalt zu laden, vielleicht das Laden in einen Dienst, der von der Widget-Klasse gestartet wurde? –

Antwort

0

Ich hatte genau das gleiche Problem. Ich löste es, indem ich das Widget NICHT manuell über die Übertragung aktualisierte, sondern indem ich stattdessen AppWidgetManager.updateAppWidget(ComponentName, RemoteViews) von einer AsyncTask aufruft.

diese innerhalb Ihrer Widget-Klasse Versuchen:

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

aktualisieren dann durch Widget.updateWidget (diese) aus Ihrer Tätigkeit aufrufen.

0

Ich habe den gleichen programmatischen Weg verwendet, um das Widget manuell zu aktualisieren, wie Sie es taten (Von Is it possible to throw an intent for APPWIDGET_UPDATE programmatically?) und fand dies die genaue Ursache des Problems.

Dies geschieht immer noch auf 4.2 und 2.3, Offizielle und inoffizielle ROMS (Touchwiz geht absolut wild, wenn dies passiert).

Die einzige Art, wie ich dieses Problem beheben konnte, war das gesamte Update Einbeziehung der Sendung zu entfernen und das Widget remote zu aktualisieren, indem eine regelmäßige Broadcast zum Widget-Provider senden und

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

aus onReceive

Aufruf

(Dies funktioniert für mich, da meine Widgets identisch sind)

Auf diese Weise schien das Problem nicht aufzutreten und ich konnte das Widget aus der Ferne aktualisieren. Alte Frage, ich weiß, aber verdient eine Antwort, da dies alles war, was ich in diesem seltsamen Thema finden konnte.