How can I setup multiple alarms in Android?
Asked Answered
E

3

36

So far and thanks to this website, I've been able to set up an alarm that will be set up and active, even if I turn of my phone.

Now, I set up a alarm to show a reminder for event A and I need the application to setup another alarm to show another reminder for event B.

I must be doing something wrong, because it only fires the reminder for event A. It seems that once set up, any other alarm is understood as the same one. :-(

Here is the detail of what I am doing in two steps:

1) From an activity I set an alarm that at certain time and date will call a receiver

                Intent intent = new Intent(Activity_Reminder.this,
                        AlarmReceiver_SetOnService.class);

                intent.putExtra("item_name", prescription
                        .getItemName());
                intent
                        .putExtra(
                                "message",
                                Activity_Reminder.this
                                        .getString(R.string.notif_text));
                intent.putExtra("item_id", itemId);
                intent.putExtra("activityToTrigg",
                        "com.companyName.appName.main.Activity_Reminder");

                PendingIntent mAlarmSender;

                mAlarmSender = PendingIntent.getBroadcast(
                        Activity_Reminder.this, 0, intent, 0);

                long alarmTime = dateMgmt.getTimeForAlarm(pickedDate);
                Calendar c = Calendar.getInstance();
                c.setTimeInMillis(alarmTime);
                // Schedule the alarm!
                AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                am.set(AlarmManager.RTC_WAKEUP, alarmTime + 15000,
                        mAlarmSender);

2) From the receiver I call a service

        Bundle bundle = intent.getExtras();
        String itemName = bundle.getString("item_name");
        String reminderOrAlarmMessage = bundle.getString("message");
        String activityToTrigg = bundle.getString("activityToTrigg");
        int itemId = Integer.parseInt(bundle.getString("item_id"));
        NotificationManager nm = (NotificationManager) context.getSystemService("notification");
        CharSequence text = itemName + " "+reminderOrAlarmMessage;
        Notification notification = new Notification(R.drawable.icon, text,
                System.currentTimeMillis());
        Intent newIntent = new Intent();
        newIntent.setAction(activityToTrigg);
        newIntent.putExtra("item_id", itemId);
        CharSequence text1= itemName + " "+reminderOrAlarmMessage;
        CharSequence text2= context.getString(R.string.notif_Go_To_Details);
        PendingIntent pIntent = PendingIntent.getActivity(context,0, newIntent, 0);
        notification.setLatestEventInfo(context, text1, text2, pIntent);
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        notification.defaults = Notification.DEFAULT_ALL;
        nm.notify(itemId, notification);

Thanks in Advance,

monn3t

Exurb answered 17/7, 2010 at 21:26 Comment(0)
K
78

Ok, when you set an PendingIntent, you're supposed to assign it a unique ID to it, incase you want to identify it later (for modifying/canceling it)

static PendingIntent    getActivity(Context context, int requestCode, Intent intent, int flags) 
//Retrieve a PendingIntent that will start a new activity, like calling Context.startActivity(Intent).
static PendingIntent    getBroadcast(Context context, int requestCode, Intent intent, int flags) 
//Retrieve a PendingIntent that will perform a broadcast, like calling Context.sendBroadcast().

The Request code is that ID.

In your code, you keep resetting the SAME PendingIntent, instead use a different RequestCode each time.

PendingIntent pIntent = PendingIntent.getActivity(context,uniqueRQCODE, newIntent, 0);

It has to be an integer, i suppose you have a primaryid (itemId) that can identify Alarm A from Alarm B.

Kapoor answered 18/7, 2010 at 6:34 Comment(14)
Thank you stOle... what you suggested did the trick. I didn't answer before because I wanted to make sure it was working properly and it is... Again thank you, monn3tExurb
@stOle: Please help me for this one also:#8665521Evolution
@st0le: i am able to get the alarm for different date and time but they all get broadcast the same message. How to handle that? I want to set the different message for different alarm. . .Evolution
@iDroidExplorer, posted an answer for you.Kapoor
@st0le:I have managed to setup multiple alarm .But how will i cancel these alarms..Could u plzz help me..?Plainclothesman
@ShahzadImam, See here Call the alarmManager.cancel() function with a PendingIndent, with Id equal to the id you used to setup the alarm.Kapoor
@st0le:Ok thats it.Then its not a big deal..but can u help here i am facing context problem cause i am not using it inside activity extended class.This line shows error under Alarm_service AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);.....It is defined in other classPlainclothesman
@ShahzadImam, What class is it? Eithor Way you need a Context to call getSystemService(), Pass a Context Variable and call context.getSystemService(Context.ALARM_SERVICE)Kapoor
@Kapoor API docs say that the requestCode parameter is currently not used, so is it wrong?Negris
@Kapoor Docs say If the creating application later re-retrieves the same kind of PendingIntent (same operation, same Intent action, data, categories, and components, and same flags), it will receive a PendingIntent representing the same token if that is still valid, and can thus call cancel() to remove it, so it should not matter which requestCode you pass to getBroadcast().. if you use the same requestCode but two different Intents you should get two different pendingIntents not overwrite the same one. At least this is what I've understood on the PendingIntent API docsNegris
@GianniCostanzi, see hereKapoor
@Kapoor I see that, but information is not up to date there... So I'm used to specify different values for requestCode but I still think that as long as the two intents are not equal (i.e. the action, class, category etc are not all equal) you do not overwrite an existing pendingIntent, even if the requestCode is the same. Maybe the request code is important in case you want to schedule two pending intents with the same action/category/etc but different extras (which are not taken into account when testing Intent equality). BTW thx for the linkNegris
@Kapoor thanks I was building a somewhat similar app. Just in practical situation, how do you suggest to keep track of requestCode? Should I use a counter?Abeyance
Probably a column in the database. The answer is 7 years old, I've been away from Android for a while now. Sorry can't help more.Kapoor
B
1

You can set up multiple alarms by supplying different request code in pendingIntent.getBroadcast(......)

The approach which I used to setup multiple alarm is that I created a single alarm. I initialized a static integer in alarm setting class which will be incremented each time from my main activity whenever I click on "add alarm" button in my main activity. E.g.

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

public void addAlarmClick(View v) {
    AlarmActivity.broadcastCode++;
    startActivity(new Intent(this, AlarmActivity.class));
}
}

AlarmActivity.java

public class AlarmActivity extends AppCompatActivity {`
//........
public static int broadcastCode=0;
//........
Intent myIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this,
                            broadcastCode, myIntent, 0);
Burck answered 4/8, 2015 at 9:7 Comment(0)
S
0

For an easier way, if you are listing your Alarms by RecyclerView,

PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), recyclerAdapterAlarm.getItemCount()+1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

It works for me.

Stretch answered 2/10, 2020 at 14:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.