2016-12-05 5 views
1

Hallo das ist meine erste Frage zu Stack Overflow. Ich schreibe eine App für Android, die ein Multi-Timer ist. Die Art, wie ich es eingerichtet habe, ist so, dass wenn onStop() aufgerufen wird, werde ich alle meine Timer abbrechen und vier ausstehende Absichten in AlarmManager starten, die die Zeit weiter herunterzählen. Wenn der Benutzer zur App zurückkehrt, werden die Timer im AlarmManager gelöscht und neue Timer erstellt, die weiter herunterzählen. Ich verwende sharedpreferences, um alle meine Werte zu speichern.multiple alarm brodcastreceiver android

Ich bin mir ziemlich sicher, dass das Problem in meiner BroadcastReceiver-Klasse ist. Was passiert ist, ich starte die App, ich starte mehrere Timer, drücke die Zurück-Taste (Call onStop), dann gehe zur App zurück und stoppe und setze alle Timer zurück. Ich drücke dann wieder zurück (Call on Stop) und der BroadcastReceiver feuert viermal. Es sollte jedoch überhaupt nicht ausgelöst werden, da die Timer alle zurückgesetzt wurden.

Nochmals, ich denke, das Problem ist in OnReceive, weil ich es nicht für vier pendingIntents eingerichtet habe, weil ich nicht herausfinden kann, wie. Das ist meine eigentliche Frage. Kann ich für vier pendingIntents in einer BroadcastReceiver-Klasse einrichten? wie mache ich das wenn ja?

Ich möchte auch so einrichten, dass, wenn der Alarm bereits spielt und ein weiterer Alarm im Alarmmanager endet, es nicht mehr den Alarmton spielt und stattdessen nur den Text auf der Benachrichtigung ändert, die bereits dort ist.

P.S. Ich bin wirklich neu in Android und Programmierung im Allgemeinen. Ich entschuldige mich, wenn das eine dumme Frage ist und auch wenn die Formatierung meines Posts nicht sehr gut ist.

-Code für die Einstellung Alarmmanager:

public void setAlarmManager() { 
    long wakeUpTime = timerPreferences.getStartTime() + millisToCount; 
    long wakeUpTimeTwo = timerPreferences.getStartTimeTwo() + millisToCountTwo; 
    long wakeUpTimeThree = timerPreferences.getStartTimeThree() + millisToCountThree; 
    long wakeUpTimeFour = timerPreferences.getStartTimeFour() + millisToCountFour; 

    Log.v(TAG, "Millis For AM " + millisToCount); 
    Log.v(TAG, "Millis Two For AM " + millisToCountTwo); 
    Log.v(TAG, "Millis Three For AM " + millisToCountThree); 
    Log.v(TAG, "Millis Four For AM " + millisToCountFour); 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    if (millisToCount > 0) { 
     PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTime, sender), sender); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTime, sender); 
     } 
     Log.v(TAG, "Alarm Manager Set"); 
    } 

    if (millisToCountTwo > 0) { 
     PendingIntent senderTwo = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeTwo, senderTwo), senderTwo); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeTwo, senderTwo); 
     } 
     Log.v(TAG, "Alarm Manager Two Set"); 
    } 

    if (millisToCountThree > 0) { 
     PendingIntent senderThree = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeThree, senderThree), senderThree); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeThree, senderThree); 
     } 
     Log.v(TAG, "Alarm Manager Three Set"); 
    } 

    if (millisToCountFour > 0) { 
     PendingIntent senderFour = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeFour, senderFour), senderFour); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeFour, senderFour); 
     } 
     Log.v(TAG, "Alarm Manager Four Set"); 
    } 
} 

-Code zum Entfernen von Alarmmanager:

public void removeAlarmManager() { 
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderTwo = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderThree = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    PendingIntent senderFour = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    am.cancel(sender); 
    am.cancel(senderTwo); 
    am.cancel(senderThree); 
    am.cancel(senderFour); 
} 

BroadcastReceiver Klasse für den Alarm:

public class AlarmReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent notificationIntent = new Intent(context, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

    NotificationCompat.Builder timerNotificationBuilder = new NotificationCompat.Builder(context); 
    Uri notification = Uri.parse("android.resource://" + "com.example.iinewmanii.professionalkitchentimer" + "/" + R.raw.alarm_clock_short); 
    timerNotificationBuilder.setSound(notification) 
      .setPriority(2) 
      .setColor(Color.rgb(239, 82, 79)) 
      .setContentTitle("Professional Kitchen timer") 
      .setAutoCancel(true) 
      .setContentText("Timer 1 Has Finished") 
      .setSmallIcon(R.mipmap.ic_warning_white_24dp) 
      .setWhen(System.currentTimeMillis()) 
      .setContentIntent(pendingIntent); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       timerNotificationBuilder.setCategory(CATEGORY_ALARM); 
      } 

    Notification timerNotification = timerNotificationBuilder.build(); 
    timerNotification.flags |= Notification.FLAG_INSISTENT; 
    NotificationManager timerNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    timerNotificationManager.notify(0, timerNotification); 
} 

}

Antwort

0

I ended bis ich das selbst gelöst habe. Was ich tun musste, war Extras hinzuzufügen, die meine AlarmReceiver-Klasse bekommen konnte, um zu erkennen, welchen Alarm ich abbrechen wollte. Ich dachte, dass die ID, die mit der ausstehenden Absicht übergeben wurde, in der Lage wäre, dies zu tun, aber dieser Wert wird anscheinend nicht übergeben. Hier ist mein Code.

Set Alarm Manager:

private void setAlarmManager() { 
    long wakeUpTime = timerPreferences.getStartTime() + millisToCount; 
    long wakeUpTimeTwo = timerPreferences.getStartTimeTwo() + millisToCountTwo; 
    long wakeUpTimeThree = timerPreferences.getStartTimeThree() + millisToCountThree; 
    long wakeUpTimeFour = timerPreferences.getStartTimeFour() + millisToCountFour; 

    Log.v(TAG, "Millis For AM " + millisToCount); 
    Log.v(TAG, "Millis Two For AM " + millisToCountTwo); 
    Log.v(TAG, "Millis Three For AM " + millisToCountThree); 
    Log.v(TAG, "Millis Four For AM " + millisToCountFour); 

    Log.v(TAG, "Paused Time For AM " + pausedTime); 
    Log.v(TAG, "Paused Time Two For AM " + pausedTimeTwo); 
    Log.v(TAG, "Paused Time Three For AM " + pausedTimeThree); 
    Log.v(TAG, "Paused Time Four For AM " + pausedTimeFour); 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    if (millisToCount > 0) { 
     intent.putExtra("timerNumberOneId", 1); 
     PendingIntent sender = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTime, sender), sender); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTime, sender); 
     } 
     Log.v(TAG, "Alarm Manager Set"); 
    } 

    if (millisToCountTwo > 0) { 
     intent.putExtra("timerNumberTwoId", 2); 
     PendingIntent senderTwo = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeTwo, senderTwo), senderTwo); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeTwo, senderTwo); 
     } 
     Log.v(TAG, "Alarm Manager Two Set"); 
    } 

    if (millisToCountThree > 0) { 
     intent.putExtra("timerNumberThreeId", 3); 
     PendingIntent senderThree = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeThree, senderThree), senderThree); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeThree, senderThree); 
     } 
     Log.v(TAG, "Alarm Manager Three Set"); 
    } 

    if (millisToCountFour > 0) { 
     intent.putExtra("timerNumberFourId", 4); 
     PendingIntent senderFour = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      am.setAlarmClock(new AlarmManager.AlarmClockInfo(wakeUpTimeFour, senderFour), senderFour); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, wakeUpTimeFour, senderFour); 
     } 
     Log.v(TAG, "Alarm Manager Four Set"); 
    } 
} 

Remove Alarm Manager:

private void removeAlarmManager() { 
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Intent intent = new Intent(this, AlarmReceiver.class); 

    intent.getIntExtra("timerNumberOneId", 0); 
    PendingIntent sender = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberTwoId", 0); 
    PendingIntent senderTwo = PendingIntent.getBroadcast(this, 2, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberThreeId", 0); 
    PendingIntent senderThree = PendingIntent.getBroadcast(this, 3, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    intent.getIntExtra("timerNumberFourId", 0); 
    PendingIntent senderFour = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    am.cancel(sender); 
    am.cancel(senderTwo); 
    am.cancel(senderThree); 
    am.cancel(senderFour); 

    Log.v(TAG, "Alarms Removed"); 
} 

AlarmReceiver Klasse:

public class AlarmReceiver extends BroadcastReceiver { 

PrefUtils timerPreferences = null; 
private final static String ALARM_NOTIFICATION = "alarm_notification"; 
private final int timerOneNotifColor = Color.argb(255, 239, 82, 79); 
private final int timerTwoNotifColor = Color.argb(255, 250, 225, 85); 
private final int timerThreeNotifColor = Color.argb(255, 94, 171, 92); 
private final int timerFourNotifColor = Color.argb(255, 250, 150, 27); 
private final int timerOneLightColor = Color.argb(255, 255, 0, 0); 
private final int timerTwoLightColor = Color.argb(255, 255, 255, 0); 
private final int timerThreeLightColor = Color.argb(255, 0, 255, 0); 
private final int timerFourLightColor = Color.argb(255, 255, 55, 0); 

private void alarmNotification(int timerNumber, Context context, int notifColor, int lightColor, Intent intent) { 
    int timerNumberOneId = intent.getIntExtra("timerNumberOneId", 0); 
    int timerNumberTwoId = intent.getIntExtra("timerNumberTwoId", 0); 
    int timerNumberThreeId = intent.getIntExtra("timerNumberThreeId", 0); 
    int timerNumberFourId = intent.getIntExtra("timerNumberFourId", 0); 
    int notifId = 0; 

    Uri notification = Uri.parse("android.resource://" + "com.professionalkitchentools.iinewmanii.professionalkitchentimer" + "/" + R.raw.alarm_clock_short); 

    intent = new Intent(context, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent sender = PendingIntent.getActivity(context, 1, intent, 0); 
    PendingIntent senderTwo = PendingIntent.getActivity(context, 2, intent, 0); 
    PendingIntent senderThree = PendingIntent.getActivity(context, 3, intent, 0); 
    PendingIntent senderFour = PendingIntent.getActivity(context, 4, intent, 0); 

    NotificationCompat.Builder timerNotificationBuilder = new NotificationCompat.Builder(context); 
    int lightFlashingInterval = 500; 
    timerNotificationBuilder.setPriority(2) 
      .setColor(notifColor) 
      .setSound(notification) 
      .setLights(lightColor, lightFlashingInterval, lightFlashingInterval) 
      .setContentTitle("Timer " + timerNumber + " has finished") 
      .setContentText("Professional Kitchen Timer") 
      .setSmallIcon(R.mipmap.ic_warning_white_24dp) 
      .setWhen(System.currentTimeMillis()) 
      .setShowWhen(true) 
      .setGroup(ALARM_NOTIFICATION) 
      .setAutoCancel(true); 
    if (timerNumberOneId == 1) { 
     notifId = 1; 
     timerNotificationBuilder.setContentIntent(sender); 
    } 

    if (timerNumberTwoId == 2) { 
     notifId = 2; 
     timerNotificationBuilder.setContentIntent(senderTwo); 
    } 

    if (timerNumberThreeId == 3) { 
     notifId = 3; 
     timerNotificationBuilder.setContentIntent(senderThree); 
    } 

    if (timerNumberFourId == 4) { 
     notifId = 4; 
     timerNotificationBuilder.setContentIntent(senderFour); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     timerNotificationBuilder.setCategory(CATEGORY_ALARM); 
    } 

    Notification timerNotification = timerNotificationBuilder.build(); 
    timerNotification.flags |= Notification.FLAG_INSISTENT; 
    NotificationManager timerNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    timerNotificationManager.notify(notifId, timerNotification); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    timerPreferences = new PrefUtils(context); 
    int timerNumberOneId = intent.getIntExtra("timerNumberOneId", 0); 
    int timerNumberTwoId = intent.getIntExtra("timerNumberTwoId", 0); 
    int timerNumberThreeId = intent.getIntExtra("timerNumberThreeId", 0); 
    int timerNumberFourId = intent.getIntExtra("timerNumberFourId", 0); 

    if (timerNumberOneId == 1) { 
     alarmNotification(timerNumberOneId, context, timerOneNotifColor, timerOneLightColor, intent); 
     timerPreferences.setTimerOneRunning(false); 
     timerPreferences.setStartTime(0); 
     timerPreferences.setOriginalTime(0); 
     timerPreferences.setTimerPaused(false); 
     timerPreferences.setPausedTime(0); 
    } 

    if (timerNumberTwoId == 2) { 
     alarmNotification(timerNumberTwoId, context, timerTwoNotifColor, timerTwoLightColor, intent); 
     timerPreferences.setTimerTwoRunning(false); 
     timerPreferences.setStartTimeTwo(0); 
     timerPreferences.setOriginalTimeTwo(0); 
     timerPreferences.setTimerTwoPaused(false); 
     timerPreferences.setPausedTimeTwo(0); 
    } 

    if (timerNumberThreeId == 3) { 
     alarmNotification(timerNumberThreeId, context, timerThreeNotifColor, timerThreeLightColor, intent); 
     timerPreferences.setTimerThreeRunning(false); 
     timerPreferences.setStartTimeThree(0); 
     timerPreferences.setOriginalTimeThree(0); 
     timerPreferences.setTimerThreePaused(false); 
     timerPreferences.setPausedTimeThree(0); 
    } 

    if (timerNumberFourId == 4) { 
     alarmNotification(timerNumberFourId, context, timerFourNotifColor, timerFourLightColor, intent); 
     timerPreferences.setTimerFourRunning(false); 
     timerPreferences.setStartTimeFour(0); 
     timerPreferences.setOriginalTimeFour(0); 
     timerPreferences.setTimerFourPaused(false); 
     timerPreferences.setPausedTimeFour(0); 
    } 
} 

}