2010-09-10 12 views

risposta

26

Jovan, ecco un metodo per rendere il codice compatibile per 2.0 + e 1.6- (il codice mostra come rilevare quale sia compatibile) http://android-developers.blogspot.com/2010/02/service-api-changes-starting-with.html

Per 2.0+, ho messo insieme un po ' codice di esempio (usando startForeground). Si noti che alcuni codici sono ora deprecati, tuttavia Notification.Builder utilizza il livello API 11 (3.x), il che significa che non lo userò finché la maggior parte dei telefoni non utilizza una versione Android compatibile. Poiché la stragrande maggioranza dei telefoni ora esegue alcune versioni di 2.x, penso che sia abbastanza sicuro saltare il controllo di compatibilità.

final static int myID = 1234; 

//The intent to launch when the user clicks the expanded notification 
Intent intent = new Intent(this, SomeActivityToLaunch.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0); 

//This constructor is deprecated. Use Notification.Builder instead 
Notification notice = new Notification(R.drawable.icon_image, "Ticker text", System.currentTimeMillis()); 

//This method is deprecated. Use Notification.Builder instead. 
notice.setLatestEventInfo(this, "Title text", "Content text", pendIntent); 

notice.flags |= Notification.FLAG_NO_CLEAR; 
startForeground(myID, notice); 

inserire questo codice all'interno onStartCommand() del vostro servizio e siete a posto. (Ma potresti mettere questa sezione di codice ovunque nel tuo servizio.)

P.S. per evitare che il servizio si trovi in ​​primo piano usa semplicemente stopForeground(true); ovunque nel tuo servizio

+0

Perché è necessario impostare FLAG_NO_CLEAR per un servizio in esecuzione in primo piano? C'è un modo per "cancellare" la notifica di un servizio in primo piano? So che AUTO_CANCEL [non funziona] (http://stackoverflow.com/questions/4561521/android-notification-flag-auto-cancel-not-working). – Eduardo

+1

Perché non utilizzare il generatore di notifiche compat fornito nella libreria di supporto per ottenere i vantaggi della nuova API, mantenere la compatibilità e non scrivere codice deprecato? – LoungeKatt

+0

@TwistedUmbrella: Android era (è) ancora in evoluzione ... al momento della scrittura la libreria di supporto Android non forniva questa funzionalità. –

0

Io non sono esattamente sicuro se questo è quello che stai cercando, ma tutto quello che dovete fare è creare un oggetto di notifica (mOngoingNote sotto) e chiamare startForeground utilizzando un ID di notifica insieme alla notifica effettiva.

startForeground(NOTEMAN_ID, mOngoingNote); 
5

Questo codice utilizzerà la migliore opzione disponibile per qualsiasi API aggiungendo la libreria di supporto Android al tuo progetto. In Eclipse, fare clic con il tasto destro del mouse sul progetto, andare su Strumenti Android e fare clic sull'opzione "Aggiungi libreria di supporto ..." per scaricarla e aggiungerla.

final static int myID = 1234; 

//The intent to launch when the user clicks the expanded notification 
Intent intent = new Intent(this, SomeActivityToLaunch.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0); 

if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.DONUT) { 
// Build.VERSION.SDK_INT requires API 4 and would cause issues below API 4 

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
    builder.setTicker("TICKER").setContentTitle("TITLE").setContentText("CONTENT") 
      .setWhen(System.currentTimeMillis()).setAutoCancel(false) 
      .setOngoing(true).setPriority(Notification.PRIORITY_HIGH) 
      .setContentIntent(pendIntent); 
    Notification notification = builder.build(); 

} else { 

    Notification notice = new Notification(R.drawable.icon_image, "Ticker text", System.currentTimeMillis()); 
    notice.setLatestEventInfo(this, "Title text", "Content text", pendIntent); 

} 
notification.flags |= Notification.FLAG_NO_CLEAR; 
startForeground(myID, notification); 

inserisce il codice nel metodo di avvio che si sta utilizzando per il vostro servizio, poi, quando si desidera che il processo in primo piano per fermare, chiamare stopForeground(true); ovunque nel vostro servizio

+3

Manca 'builder.setSmallIcon (int)'. Senza che il costruttore personalizzato venga ignorato con la notifica predefinita. –

+0

La domanda non riguardava come implementare una notifica personalizzata. Era come usare il metodo startForeground().Quello che fai al di sopra e al di là è la tua preferenza personale. – LoungeKatt

Problemi correlati