Homescreen Widget aktualisieren

  • 4 Antworten
  • Letztes Antwortdatum
B

babsitz

Neues Mitglied
0
Hallo zusammen,

ich habe ein Widget programmiert, welches mir das aktuelle Datum und die aktuelle Zeit auf dem Homescreen anzeigt. Klappt allerdings nur teilweise, wenn ich das Widget dem Bildschirm hinzufüge wird die Zeit aktualisiert. Aber dann passiert nichts mehr.

Könnt ihr mal über meinen Code schauen? Ich finde den Fehler nicht!

Code:
public class MyWidgetProvider extends AppWidgetProvider {
	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
	
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
			Timer timer = new Timer();
		timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);
	}
	
		private class MyTime extends TimerTask {
			RemoteViews remoteViews;
			AppWidgetManager appWidgetManager;
			ComponentName thisWidget;
			String date = sdf.format(new Date().getTime());
			public MyTime(Context context, AppWidgetManager appWidgetManager) {
				this.appWidgetManager = appWidgetManager;
				remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
				thisWidget = new ComponentName(context, MyWidgetProvider.class);
			}
		
			@Override
			public void run() {
				remoteViews.setTextViewText(R.id.update,
						"Time = " + date);
				appWidgetManager.updateAppWidget(thisWidget, remoteViews);
			}
		}
	
		@Override
		public void onReceive(Context context, Intent intent) {
			final String action = intent.getAction();
			if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
				final int appWidgetId = intent.getExtras().getInt(
						AppWidgetManager.EXTRA_APPWIDGET_ID,
						AppWidgetManager.INVALID_APPWIDGET_ID);
				if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
					this.onDeleted(context, new int[] { appWidgetId });
				}
			} else {
				super.onReceive(context, intent);
			}
		}
}

An was kann das liegen?

Grüße
Jörg
 
Das liegt daran, dass ein AppWidgetProvider ein aufgebohrter BroadcastReceiver ist. Du kannst darin nicht anfangen asynchrone Dinge auszuführen, wie einen TimerTask zu starten. Der Receiver arbeitet seine Aufgabe ab und ist dann weg. Wenn der Timertask dann anklopft ist niemand da der die Tür aufmacht. Wenn du das Widget updaten willst ist ein anderer Ansatz gefragt. z.B ein Alarm der einen IntentService startet in dem du das Widget neu zeichnest.
 
Hallo strider,

danke für deine Antwort! Gibts hierzu ein downloadbares Tutorial mit Quellcode?

Grüße
Jörg
 
Ich kenne jetzt kein Tutorial, aber es gibt genug Open Source Quellen die sowas machen. Schau dir z.B mal die SLW Widgets an.
 
Ich habe eins gefunden: Funktioniert ohne Probleme. Hier der Link
 
Zurück
Oben Unten