2017-06-20 1 views
1

In meiner App verwende ich Alarmmanager. Ich gründe Alarme für eine bestimmte times.I mehrere Alarme für bestimmte zukünftige Zeit setze wie in unten erwähnt werden:Warum Alarm Manager feuert ausstehende Androide?

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Log.e("test", "on create is called"); 

    SharedPreferences preferences = getSharedPreferences("testing", MODE_PRIVATE); 
    if (!preferences.getBoolean("alarm", false)) { 
     Log.d("test", "generating alrams"); 
     setAlarm(getFirstAlarmTime(), 1, "one"); 
     setAlarm(getSecondAlarmTime(), 2, "two"); 
     setAlarm(getThirdAlarmTime(), 3 ," three"); 
     setAlarm(getFourthAlarmTime(), 4, "four"); 
     setAlarm(getFifthAlarmTime(), 5, "five"); 

     preferences.edit().putBoolean("alarm", true).apply(); 
    } 
} 

private long getFirstAlarmTime() { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 13); 
    calendar.set(Calendar.MINUTE, 7); 
    calendar.set(Calendar.SECOND,0); 

    return calendar.getTimeInMillis(); 
} 

private long getSecondAlarmTime() { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 13); 
    calendar.set(Calendar.MINUTE, 8); 
    calendar.set(Calendar.SECOND,0); 

    return calendar.getTimeInMillis(); 
} 

private long getThirdAlarmTime() { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 13); 
    calendar.set(Calendar.MINUTE, 9); 
    calendar.set(Calendar.SECOND,0); 

    return calendar.getTimeInMillis(); 
} 

private long getFourthAlarmTime() { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 13); 
    calendar.set(Calendar.MINUTE, 10); 
    calendar.set(Calendar.SECOND,0); 

    return calendar.getTimeInMillis(); 
} 

private long getFifthAlarmTime() { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 13); 
    calendar.set(Calendar.MINUTE, 11); 
    calendar.set(Calendar.SECOND,0); 

    return calendar.getTimeInMillis(); 
} 


private void setAlarm(long alarmTime, int id, String type){ 
    Intent intent = new Intent(this, NotifyService.class); 
    intent.putExtra("id", id); 
    intent.putExtra("type", type); 
    PendingIntent alarmIntent = PendingIntent.getService(getApplicationContext(), id, intent, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    manager.set(AlarmManager.RTC_WAKEUP, alarmTime, alarmIntent); 
} 

}

und unten ist der Service NotifyService ich in meiner Absicht nenne

Jeder Alarm wird zu einer bestimmten Zeit ausgelöst, wie in setAlarm() -Methode erwähnt, aber das Problem ist, wenn ich meine App kille und meine App neu starte, startet der Alarmmanager wieder ausstehende Absicht. Warum fehlt mir so etwas? Ich habe viel Zeit und Google verbracht, konnte aber keine Lösung finden. Irgendeine Hilfe?

Eine Sache, die ich festgestellt habe, dass, wenn Handy-Zeit ist sagen wir 12 Uhr und Alarm ist für 11 Uhr eingestellt und App ist gestartet Alarm wiederholt zu wiederholen. :(

+0

AlarmManager funktioniert unabhängig von Ihrer App und feuert Intents auch dann ab, wenn die App beendet wird. Was versuchst du genau zu erreichen? – SpaceBison

+0

Der Alarm sollte nur ausgelöst werden, wenn eine bestimmte Zeit wie beim Einstellen des Alarms auftritt. Nicht danach. In der aktuellen Situation, wenn ich meine App neu starte und App-Zeit ist Weg, nachdem die tatsächliche Alarmzeit eingestellt ist, aber es beginnt, ausstehende Absicht zu feuern. Warum ist das so? –

Antwort

0

Sind Sie sicher, dass der Alarm tatsächlich feuert, nachdem Sie Ihre App töten und es ist nicht einfach Ihre Absicht geliefert werden wieder, wie Sie durch fordern START_REDELIVER_INTENT in Ihrem NotifyService zurück.

‚START_REDELIVER_INTENT‘ im Grunde anfordert wenn die Aufgabe, dass die Absicht wiederholt werden soll getötet wird. Für Sie-Fall verwenden, so scheint es, dass Sie START_NOT_STICKY zurückgeben müssen, da Sie nur die Absicht einmal schießen wollen.

What is START_STICKY,START_NOT_STICKY and START_REDELIVER_INTENT Service

auch in Antwort zu

Eine Sache, die ich habe bemerkt, dass, wenn Handy Zeit sagt, ist 12 o Uhr und Alarm für 11.00 Uhr und App einstellen kann gestartet Alarm hält wiederholen.

Alle Alarme, die in der Vergangenheit für eine bestimmte Zeit eingestellt wurden, werden sofort ausgelöst.

+0

Ich muss noch eine Sache wissen, in meinem Code stelle ich 5 Alarme mit unterschiedlichen Zeiten ein. Jetzt möchte ich 5 weitere Alarme einstellen, wenn der letzte Treffer erfolgt. Dafür sende ich "id" mit jeder Intention und in der Methode onStartCommand() prüfe ich den "id" -Schlüssel (der über das Schlüsselwertpaar der Absicht gesendet wurde), wenn dieser einen Schlüssel mit "id" hat und der Wert die Nummer 5 I ist müssen 5 weitere Alarme generieren. und ich mache dasselbe, aber meine Frage ist, muss ich die vorherigen 5 Alarme abbrechen? Werden die vorherigen 5 Alarme aufgerufen, weil sie auch registriert wurden? Wenn ich die vorherigen 5 stornieren muss, wie kann ich das tun? –

+0

Ich habe gegoogelt und festgestellt, dass ich die gleiche PendingIntent bekommen muss, um abzubrechen, wie bekomme ich die gleiche ausstehende Absicht? Wie ich 5 Alarme mit jedem schwebenden Intent erstellen, wie ist es möglich, den gleichen Intent Store zu halten? Irgendeine Hilfe? –

+1

Sie sollten eine neue Frage öffnen, anstatt zusätzliche Fragen als Kommentare zu Antworten auf vorhandene Fragen hinzuzufügen. Ihre zusätzlichen Fragen wären nicht einfach in dem für Kommentare vorgesehenen Raum zu beantworten. Wenn meine Antwort oben Ihre ursprüngliche Frage beantwortet hat, markieren Sie sie bitte als akzeptiert. Wenn du eine neue Frage postest, füge den Link hier ein und ich werde sicherstellen, dass ich einen Blick darauf werfen. – Kuffs

Verwandte Themen