2011-12-23 10 views

risposta

45

Sì, è necessario controllare AlarmManager per impostare un "allarme" ricorrente. Questo è meglio per la durata della batteria del dispositivo, poiché a differenza di un servizio non viene eseguito costantemente in background. L'allarme attiva uno broadcast receiver che eseguirà il codice personalizzato.

Come nota finale, ci sono valori di enumerazione per i tempi dell'allarme inclusi giornaliero, metà giornaliero e molti altri anche se è possibile semplicemente impostare un valore reale.

Un buon esempio può essere trovato nel follow SO postale:

Alarm Manager Example

Aggiornamento

più recente funzionalità sono state aggiunte ad Android. Se stai leggendo questo, ti consiglierei di guardare in GcmNetworkManager. Questo ottimizza la durata della batteria e funziona pre-lollipop. Per Lollipop in poi è possibile utilizzare JobScheduler. Consiglierei di usare queste classi su AlarmManager.

+0

Grazie, questo è esattamente quello che stavo cercando. – siemian

+0

@Graham Smith Di interesse, hai scritto il tuo? –

+0

@Graham Smith Il link che hai fornito è rotto. Puoi fornire un link di lavoro? – Zapnologica

6

Come alternativa sto paragonando la settimana in corso:

Calendar cal = Calendar.getInstance(); 
int currentWeekOfYear = cal.get(Calendar.WEEK_OF_YEAR); 

SharedPreferences sharedPreferences= this.getSharedPreferences("appInfo", 0); 
int weekOfYear = sharedPreferences.getInt("weekOfYear", 0); 

if(weekOfYear != currentWeekOfYear){ 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putInt("weekOfYear", currentWeekOfYear); 
    editor.commit(); 
    // Your once a week code here 
} 

Non sto sostenendo questo è meglio che la soluzione di allarme. Sto solo mostrando un approccio diverso.

12

Penso che la soluzione migliore sia GcmNetworkManager. Fondamentalmente ha tutto ciò di cui hai bisogno da AlarmManager e persistenza, quindi il lavoro può continuare l'esecuzione dopo il riavvio.

Esempio:

PeriodicTask task = new PeriodicTask.Builder() 
     .setService(MyTaskService.class) 
     .setTag(TASK_TAG_PERIODIC) 
     .setPeriod(5L) 
     .build(); 

mGcmNetworkManager.schedule(task); 
+1

Hai ragione - probabilmente questo diventerà il modo normale di farlo. Ho scritto la mia risposta 2,5 anni fa, quindi le cose vanno avanti. Direi che è necessario aggiungere il Job Scheduler di Lollipop per Android 5+ poiché NON DEVI usare il 'GcmNetworkManager'. Ho svitato btw. –