2016-08-04 26 views
0

In meinem Projekt habe ich eine Anforderung, eine Aufgabe zu planen, um Benachrichtigungen zu einem bestimmten Zeitpunkt jeden Tag anzuzeigen. Wenn ich es heute einige Zeit setze, wird es ausgelöst und alles läuft wie erwartet, aber wenn die geplante Zeit morgen ist, wird sie nicht ausgelöst. Unten ist mein Code, um den Alarmmanager einzustellen.Alarmmanager löst nicht jeden Tag aus

public void setMorningRepeatingTask(Context context, int hour, int minutes) { 
     alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmBroadcastReceiver.class); 
     intent.setAction(Constants.ALARM_MANAGER_INTENT_MORNING_UNIQUE_ACTION); 
     alarmIntent = PendingIntent.getBroadcast(context, Constants.MORNING_ALARM_UNIQUE_ID, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, hour); 
     calendar.set(Calendar.MINUTE, minutes); 
     if(checkIfTheTimeHasPassed(calendar.getTimeInMillis())){ 
      calendar.add(Calendar.DATE, 1); 
     } 
     alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       AlarmManager.INTERVAL_DAY, alarmIntent); 
     FileLogger.writeToFile("Alarm Set", "Morning repeating Alarm Set"); 
    } 

public static boolean checkIfTheTimeHasPassed(long timeInMillis) { 
     long nowTime = new Date().getTime(); 
     return nowTime > timeInMillis; 
    } 

Bitte helfen.

+0

'AlarmManager' kann nicht in Szenarien mit Zwangshalt und Telefonneustart bestehen. Sind Sie sicher, dass Sie nicht in beide Kategorien fallen? – Shaishav

+0

Was ist Ihre Android-Version? und Sie können dieses Thema http://stackoverflow.com/questions/38742368/alarmmanager-cant-work-on-android-6-0 – sonnv1368

+0

Ich handle Telefon Neustart Szenario. Wenn ich die Nachricht Boot complete (android.intent.action.BOOT_COMPLETED) empfange, verschiebe ich die Alarme neu. Aber Kraft aufhören, ich habe nicht behandelt. Wie kann ich damit umgehen? Sind Sie sicher, dass der einmal eingestellte Alarm nicht im Hintergrund läuft, obwohl die App geschlossen ist? –

Antwort

2

Endlich fand ich eine Lösung für das Problem, mit dem ich konfrontiert bin. Ich verwendete alarmMgr.set() Methode anstelle von alarmMgr.setRepeating() und wenn der Alarm klingelt, stellte ich einen weiteren Alarm für den nächsten Tag ein. Auf diese Weise wird es Tag für Tag wiederholt. :)

Ich möchte immer noch wissen, was mit alarmMgr.setRepeating() Methode falsch ist. Also, wenn jemand eine Idee hat, bitte posten Sie die Lösung.

Unten ist der Code, den ich implementiert habe.

public void setMorningRepeatingTask(Context context, int hour, int minutes, boolean forceScheduleNextDay) { 
     alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmBroadcastReceiver.class); 
     intent.putExtra(Constants.KEY_ALARM_TIME, Constants.VALUE_MORNING_ALARM); 
     alarmIntent = PendingIntent.getBroadcast(context, Constants.MORNING_ALARM_UNIQUE_ID, intent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, hour); 
     calendar.set(Calendar.MINUTE, minutes); 
     if (Utility.checkIfTheTimeHasPassed(calendar.getTimeInMillis()) || forceScheduleNextDay) { 
      calendar.add(Calendar.DATE, 1); 
     } 
     alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); 
     Log.i("Morning Alarm", "Alarm is set for " + calendar.get(Calendar.DATE) + " at " 
       + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE)); 
     FileLogger.writeToFile("Alarm Set", "Morning repeating Alarm Set"); 
     FileLogger.writeToFile("Morning Alarm", "Alarm is set for " + calendar.get(Calendar.DATE) + " at " 
       + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE)); 
    } 

Die obige Methode dient zum Einstellen des Alarms.

if (Utility.checkIfTheTimeHasPassed(calendar.getTimeInMillis()) { 
    calendar.add(Calendar.DATE, 1); 
} 

public static boolean checkIfTheTimeHasPassed(long timeInMillis) { 
    long nowTime = new Date().getTime(); 
    return nowTime > timeInMillis; 
} 

Die obige Bedingung wird geprüft, ob die Zeit bereits abgelaufen ist, und wenn es übergeben wird, wird es den Alarm für den nächsten Tag planen.

Wenn der Alarm ausgelöst wird, wird die onReceive() Methode der BroadcastReceiver-Unterklasse aufgerufen.

@Override 
public void onReceive(Context context, Intent intent) { 
    FileLogger.writeToFile("Alarms rang off!!", "Alarm rang"); 

    //Add your logic here 

    setMorningRepeatingTask(context,morningTimeCalender.get(Calendar.HOUR_OF_DAY), morningTimeCalender.get(Calendar.MINUTE), true); 
} 

Bei diesem Verfahren nach tun die Dinge, ich auf Alarm klingeln soll, neu planen ich den Alarm für die gleiche Methode verwenden nächsten Tag.

+0

@jaykrrishnan Salim ich habe das gleiche Problem Alaram wird Triger heute, aber nicht täglich ernten können Sie bitte post yoye arbeiten Codes –

+0

Wenn meine Lösung für Sie arbeitete, bitte upvote es. –

+0

@ Jayakrishnan Salim ja sicher, ich überprüfe nur, weil mein Fluss wenig diffrent ist, ich möchte automatische E-Mail-Fix Zeit im Alltag senden, damit ich Mapping bin. –