简体   繁体   中英

multiple alarm broadcastreceiver android

I am writing an app for Android that is a multi-timer. The way i have set it up is so that when onStop() is called I will cancel all of my timers and start four pending intents in AlarmManager that continue to countdown the time. If the user returns to the app the timers in AlarmManager are cancelled and new timers are created that continue counting down. I'm using sharedpreferences to store all of my values.

I'm pretty sure the problem is in my BroadcastReceiver class. What's happening is I start the app, I start multiple timers, hit the back button(call onStop), then return to the app and stop and reset all timers. I then press back again(call onStop again) and the BroadcastReceiver fires four times. It shouldn't be firing at all though because the timers have all been reset.

Again, I think the problem is in OnReceive because I haven't set it up for four pendingIntents because i can't figure out how to. That's what my actual question is. Is it possible for me to setup for four pendingIntents in one BroadcastReceiver class? how do I do that if so?

I would also like to set it up so that if the alarm is already playing and another alarm in alarmmanager ends that it wont start playing the alarm sound again and instead just change the text on the notification that is already there.

PS I am really new to Android and programming in general. I apologize if this is a stupid question and also if the formatting of my post is not very good.

Code for setting 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 for removing 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 class for the 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);
}

}

I ended up solving this myself. What I needed to do was add extras to the intents that my AlarmReceiver class could get in order to discern which alarm I wanted to cancel. I thought that the ID that was passed with the pending intent would be able to do this but that value apparently doesn't get passed. Here is my 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 Class:

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);
    }
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM