2012-06-07 7 views
28

Ich bin fest. Wenn meine Anwendung gestartet wird, möchte ich prüfen, ob ein Alarm aktiv ist, den ich zuvor eingestellt habe. Wenn nicht, dann möchte ich es einstellen.Gibt es eine Möglichkeit zu überprüfen, ob bereits ein Alarm ausgelöst wurde?

Ich bezog mich auf this solution. Ich versuche, die Absicht wie folgt zu entsprechen:

Intent intent = new Intent(); 
     intent.setAction("com.vit.upload"); 
     PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 

Aber es funktioniert nicht. Was würde sonst noch funktionieren?

Antwort

65

Zunächst einmal ein wenig Anleitung, wie zuvor erstellten Alarme zuzugreifen:

Sie zwischen den Alarmen, indem jeder mit einer eindeutigen ID unterscheiden kann, wie:

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

Wenn Sie zugreifen möchten Bei diesem Alarm müssen Sie denselben PendingIntent mit der gleichen eindeutigen ID erstellen. Beispielsweise wird im Folgenden nur auf einen Alarm zugegriffen, den Sie mit der PendingIntent-ID 1234 erstellt haben. Dann wird der vorherige abgebrochen und zurückgesetzt.

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

Die Idee ist einfach. Verfolgen Sie die IDs und verwenden Sie sie dann, um auf ihre jeweiligen Alarme zuzugreifen. Wenn Sie mehrere Alarme mit derselben ID erstellen, wird die vorherige durch die neueste gelöscht.

Kommen Sie zu Ihrem Hauptproblem, anstatt zu überprüfen, ob Ihr Alarm bei jedem Start Ihrer Anwendung aktiv ist, setzen Sie ihn einfach erneut in die onCreate() Methode Ihrer Aktivität. mit dem gleichen PendingIntent wie ich oben beschrieben habe. Dies erspart Ihnen die mühsame Überprüfung, ob der Alarm vorher eingestellt wurde oder nicht. Da es Ihr Ziel ist, den Alarm am Leben zu erhalten, wird es nicht schaden, den zuvor eingestellten Alarm bei jedem Start der Anwendung zu überschreiben. Stellen Sie nur sicher, dass Sie die gleiche ID verwenden, um Ihren PendingIntent zu erstellen.

Vergessen Sie nicht, wenn die Zeit für Alarm zu überprüfen ist bereits verstrichen ist oder nicht, um zu vermeiden, versuchen, einen Alarm für eine vergangene Zeit einzustellen, die sie sofort auslösen.

Lassen Sie uns einen anderen Fall betrachten: wenn Sie das Gerät ausschalten, werden alle Alarme gelöscht werden. Sie haben keine andere Wahl, als sie beim Neustart neu festzulegen. Um dies zu tun, müssen Sie eine BroadcastReceiver verwenden.

This answer helfen Ihnen weiter, wie das zu tun. Erstellen Sie einfach Ihren Alarm in der onReceive() - Methode Ihres BroadcastReceivers, wie oben vorgeschlagen.

+0

Hallo danke für workground ... Aber was ist der Fall, wenn ich keine Aktivität habe .. dann mein Boot fertig Rundfunkempfänger wird nicht in diesem Fall (Fall mit android-Version 3.0 weiter) arbeiten ... so, wie mit ihm zu kommen .. Weil ich auf einer solchen App arbeite, dass sie ... so keine Aktivität wollen wie man diesen Empfänger registrieren .. – NullPointerException

+0

Sie nur -Tags verwenden müssen. Überprüfen Sie dies: http: //developer.android.com/guide/topics/manifest/receiver-element.html. Wenn Sie einen Dienst zum Erstellen Ihres Alarms verwenden, müssen Sie den Namen der Aktivität oben in den Namen Ihrer Serviceklasse ändern. – Erol

+0

Naja ok !!! dieses ist die beste Antwort, die ich bekam, also belohne ich es !! – NullPointerException

5
  • Der erste Alarm funktioniert nicht, wenn Sie Ihr Android-Gerät neu starten.
  • Sie können die booleschen freigegebenen Einstellungen verwenden, um zu überprüfen, ob der Alarm erstellt wurde oder nicht.
  • Android anhängige Absicht Gebrauch die eindeutige ID

    int REQUEST_CODE = 2344; // Eindeutige ID
    PendingIntent pIntent = PendingIntent.getBroadcast (Kontext, REQUEST_CODE, Absicht, PendingIntent.FLAG_NO_CREATE);

Sie die Boot-Receiver Sendung verwenden, wenn das System Neustart dann wieder erstellen alaram mit dem gleichen Anforderungscode REQUEST_CODE=2344;

+0

Hey das sieht aus wie guter Vorschlag, aber das grundlegende Problem bleibt das gleiche .. Wie es überprüfen Wetter ist es bereits gesetzt ist oder nicht ?? und wenn es eine Prozedur gibt, um es zu überprüfen, wo soll ich Code dafür schreiben ?? Ich meine, wenn meine App startet oder in irgendeiner anderen Aktivität? Bitte helfen Sie mir .. – NullPointerException

3

Basiclly von meinem experiance wenn Sie die gleiche Absicht verwenden und FLAG_UPDATE_CURRENT, können Sie sicher sein, dass Sie werden nicht zwei Alarm für die gleiche Absicht eingestellt haben. Sie können auch genau auf FLAG_NO_CREATE schauen, die mit get-Funktionen verwendet wird und gibt null zurück, wenn polling intent mit der beschriebenen Absicht bereits existiert.

Denken Sie auch daran, dieselbe Anforderungs-ID für ausstehende Absicht zu verwenden, da sie unterscheidbar sind.

+0

Szczygiel Sehr wahr meine Erfahrung auch sagt, dass bei Verwendung der gleichen Absicht und setInexactRepeating funktioniert FLAG_UPDATE_CURRENT ... –

1

Basierend auf den Informationen here scheint es keinen Anruf zu geben, den Sie direkt überprüfen könnten, ob ein Alarm vorhanden ist oder nicht, aber sie bieten einige Problemumgehungen.

Verwandte Themen