13

Context.startServiceAndroid: avviare il servizio con Context.startService vs PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
context.startService(intent); 

PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0); 
pi.send(); 


Domande

  1. Quando si avvia un servizio con Context.startService vs PendingIntent?
  2. Perché dovresti usare uno sull'altro?

risposta

18

Non c'è davvero alcuna differenza.

In particolare, il metodo Context viene utilizzato per avviarlo direttamente dove in genere un PendingIntent viene utilizzato con una notifica per attivare questo intent quando viene toccato, che viene ritardato fino a quando l'utente lo tocca (in genere). Però; in genere non invierai direttamente PendingIntent perché non è quello a cui è destinato.

Un PendingIntent è un Intent che è in sospeso, in sospeso, il che significa che il suo NON dovrebbe avvenire ora, ma nel prossimo futuro. Mentre con un intento, viene inviato al momento.

Se un PendingIntent non è in sospeso quando viene utilizzato, quindi non è più un PendingIntent ed è infatti un Intento. Sconfiggendo completamente lo scopo.

+0

Quindi, c'è mai un momento in cui si vorrebbe avviare un servizio con un 'PendingIntent'? –

+2

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

+0

Ottima spiegazione, grazie! – damluar

1

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.

+0

Basta notare che è necessario aggiungere il proprio servizio in manifest e aggiungere export = "true" proprietà è importante – Lior

Problemi correlati