2013-08-13 3 views
5

Sto sviluppando un'applicazione compiti semplici in Android e ho bisogno per creare le notifiche tramite un AlarmManager. Il mio problema è che ho alcuni allarmi che dovrebbero essere eliminati -e quindi la loro notifications- ma non sono, così ho deciso -Seguendo messaggi come Delete alarm from AlarmManager using cancel() - Android per rendere l'AlarmManager una variabile statica così la stessa istanza può essere raggiunta da tutta app. Il modo in cui sto facendo questo sta avendo il seguente metodo nella mia classe principale:AlarmManager statica in Android

public static AlarmManager getAlarmManagerInstance() { 
     if (sAlarmManager == null && sContext != null) 
      sAlarmManager = (AlarmManager) sContext 
        .getSystemService(Context.ALARM_SERVICE); 
     return sAlarmManager; 
    } 

e nella variabile del sContext vengono istanziati in questo modo:

@Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_main); 
     sContext = this; 
     initActionBar(); 
    } 

E 'una buona idea creare un modello singleton da questa variabile? C'è un approccio migliore?

Grazie mille in anticipo.

+0

utilizzare lo stesso ID per creare intento attesa .. che farà lo stesso lavoro –

+0

ma sto usando gli id ​​delle attività che voglio creare/modificare per creare l'intento in sospeso, in modo come 'PendingIntent pendingFirstAlarmIntent = PendingIntent.getBroadcast ( \t \t \t \t \t questo, mGoal.getId() intValue(), l'intenzione, \t \t \t \t \t PendingIntent.FLAG_ONE_SHOT);. '.. È ancora lo stesso? – noloman

+0

Sì, questo è lo stesso ... Se non si sta annullando l'allarme, provare a utilizzare bandiere diverse ... –

risposta

1

documentazione Android dice:

Come ospite non istanziare direttamente questa classe; invece, recuperarlo tramite Context.getSystemService (Context.ALARM_SERVICE).

AlarmManager è solo una classe che fornisce l'accesso ai servizi di allarme del sistema.

Questi servizi sono in esecuzione nel sistema in modo da non si preoccupano di loro basta usare AlarmManager come interfaccia per interagire con loro.

Così ogni volta che è necessario per accedere a questo servizio solo recuperare come la documentazione dice:

Context.getSystemService (Context.ALARM_SERVICE)

1

Vorrei consigliare contro la creazione di un allarme statico.

È necessario attenersi ai consigli forniti nei commenti, per utilizzare gli ID forniti ai propri PendingIntents, in questo modo è possibile annullare/aggiornare gli allarmi sicuramente da qualsiasi punto all'interno dell'applicazione.

motivo per cui ho sconsigliato di allarme statico:

Il seguente scenario può verificarsi, si pianifica l'allarme e fare un riferimento statico ad esso, quindi l'utente riavvia il telefono. Il tuo allarme è sparito, così come il riferimento statico ad esso.

Se è necessario che gli allarmi funzionino in tale scenario, è necessario scrivere i propri ID e le informazioni richieste nelle preferenze/database/file condivisi e riprogrammarli su Boot o su qualche altro evento adatto alla propria app.

+0

ma ho già un 'BroadcastReceiver' con l'autorizzazione' ACTION_BOOT_COMPLETED' in modo che possa ricreare gli allarmi da un DB quando si riavvia il telefono. Semplicemente non capisco l'uso degli ID nel 'PendingIntent', dal momento che pensavo che il parametro che passiamo a' PendingIntent' dovrebbe essere l'ID delle attività, non l'allarme. – noloman

+0

Se non inserisci l'ID, quando crei un PendingIntent con un Intent che avvia la stessa attività/servizio (non valgono altri valori extra) Android non sarà in grado di fare la differenza tra loro e dal momento che li impacchetti in Allarmi quando pianifichi loro, il risultato finale sarà che ogni volta che crei un nuovo allarme il vecchio viene automaticamente cancellato senza che tu lo sappia. E poiché hai detto che i tuoi AlarmManager sono connessi con le tue notifiche, dovresti utilizzare ID diversi, magari usare lo stesso ID della notifica se hai dato ID univoci – JanBo

+0

http://stackoverflow.com/questions/7496603/how-to-to create-different-pendingintent-so-filterequals-return-false ... considerate anche l'impostazione di un'azione per il vostro intento, e potete filtrarli in questo modo se non vi piace impostare un id per PendingIntent. – JanBo