Quindi, ho un widget, lo voglio aggiornare ogni 60 secondi. Quando il widget viene aggiunto per la prima volta alla schermata iniziale, esegue correttamente la sua funzione di aggiornamento. Oltre a ciò, è necessario avviare un AlarmManager, che eseguirà nuovamente il metodo di aggiornamento ogni 60 secondi. Questa è la parte che sembra non fare in realtà. Qui è il mio codice:AppWidget alarmmanager non si aggiorna
public class ClockWidget extends AppWidgetProvider {
public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout);
appWidgetManager.updateAppWidget(appWidgetId, views);
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
Log.d("log","Entered update cycle");
//Unimportant for these purposes
appWidgetManager.updateAppWidget(appWidgetId, views);
}
private PendingIntent createClockTickIntent(Context context) {
Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.d("onEnabled","Widget Provider enabled. Starting timer to update widget every minute");
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context));
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.d("onDisabled", "Widget Provider disabled. Turning off timer");
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(createClockTickIntent(context));
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("onReceive", "Received intent " + intent);
if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
Log.d("onReceive", "Clock update");
// Get the widget manager and ids for this widget provider, then
// call the shared
// clock update method.
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for (int appWidgetID: ids) {
updateAppWidget(context, appWidgetManager, appWidgetID);
}
}
}
}
E 'il prodotto di un qualche tutorial che ho trovato in materia, e la mia conoscenza di Android. Secondo i miei logcats, non arriva mai al Log.d ("onReceive", "Clock update"); linea. E sì, il mio manifest è impostato con l'intento di aggiornamento dell'orologio. Grazie!
MODIFICA: Ulteriori informazioni. Inserisco una riga di log nel metodo createClockTickIntent e si attiva. Quindi immagino che questo significhi che la mia applicazione stia eseguendo la riga alarmManager.setRepeating, non ho idea del perché non si stia effettivamente ripetendo.
Anche se hai risolto il tuo problema correggendo un errore di ortografia, grazie per aver postato questo - è la dimostrazione più concisa e semplice di come usare AlarmManager per aggiornare appwidgets che ho visto ovunque! Ci sono così tante soluzioni orribilmente complicate là fuori, ma tutto ciò viene tagliato, con un metodo che è semplice da capire e implementare. Grazie! – drmrbrewer