问题
I have used the same pendingIntent to set multiple alarms using different intentId for each. the alarm is working. Now i want to cancel a particular alarm. If i use the cancel() method i would end up cancelling all the alarms. I want only a specific one to be deleted. Also the user should be able to cancel this alarm even during a second or a third launch. As in when i launch it the second time, i won't be having the same pendingIntent object. Would i have to persist the pendingIntent object? If so, how? and how do i cancel a single alarm from multiple alarms?
回答1:
You can do it like this,
In your Pending Intent you can pass a unique ID
in place of requestCode
PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
And to cancel you can use the same unique ID to cancel it, using the same Pending Intent.
am.cancel(pi);
For getting more information you can just use StackOverflow or Google, for now I think this answer will do for you. :)
回答2:
Here is a kind of hack to do this with the explanation.
First of all you should create a unique intent for the pending intent. For this purpose you can create a custom data field of the intent for your application. I do this in the following way:
Intent intent = new Intent();
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION);
Uri data = Uri.withAppendedPath(
Uri.parse("myapp://myapp/Id/#"),
String.valueOf(intentId));
intent.setData(data);
In your case intentId
will be yours unique identifier of the intent.
Then you create alarmManager notification as usual. To cancel an alarm you should do the following steps. At first you should create an intent as in the previous code sample. Then you create pending intent based on this intent (you also create the same pending intent for alarm). And then you cancel this alarm:
Intent intent = new Intent();
intent.setAction(ExampleAppWidgetProvider.MY_INTENT_ACTION);
Uri data = Uri.withAppendedPath(
Uri.parse("myapp://myapp/Id/#"),
String.valueOf(intentId));
intent.setData(data);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
来源:https://stackoverflow.com/questions/8877365/cancelling-a-single-alarm-when-you-have-multiple-alarms