I PendinIntents sono molto utilizzati per i widget. Poiché il layout di un widget in esecuzione non "appartiene" al codice, ma è invece sotto il controllo del sistema, non è possibile assegnare direttamente gli ascoltatori dei clic agli elementi dell'interfaccia. Invece si assegna un PendingIntent a quegli elementi (come pulsanti) in modo che quando l'utente li tocca, il PendingIntent viene "giustiziato", qualcosa di simile:
// get the widget layout
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.id.widget_layout);
// prepare to listen the clicks on the refresh button
Intent active = new Intent(context, WidgetCode.UpdateService.class);
PendingIntent refreshPendingIntent = PendingIntent.getService(context, 0, active, 0);
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetRefresh, refreshPendingIntent);
// send the changes to the widget
AppWidgetManager.getInstance(context).updateAppWidget(appwidgetid, remoteViews);
In questo caso un pulsante nel widget avvia un servizio. Di solito metti ulteriori informazioni nell'intento, con putExtras(), quindi il servizio otterrà tutte le informazioni necessarie per svolgere il proprio lavoro.
Quindi, c'è mai un momento in cui si vorrebbe avviare un servizio con un 'PendingIntent'? –
Se si desidera avviare un servizio nel prossimo futuro, questo sarebbe il caso ideale. Supponiamo che abbia una notifica che mostri il nuovo aggiornamento disponibile per l'account di un utente. Idealmente ci sarebbe un intento in sospeso che stabilisse una connessione a un server e scaricasse queste informazioni. Lo voglio fatto quando l'utente ha TAPpato la notifica NON immediatamente, in questo modo aspetto la convenienza dell'utente, o se l'utente non si cura di poter cancellare la notifica e il prossimo nuovo aggiornamento reagirà allo stesso modo. – JoxTraex
Ottima spiegazione, grazie! – damluar