我有一个调用帮助程序的活动,我在其中创建一个通知,该通知将在选定时间内弹出。效果很好。
我想在不同的活动中创建另一个函数,该函数可以在通知弹出之前删除挂起的警报。我尝试了很多在网上找到的方法,但没有任何效果。我做错了什么?
// Add Alarm
public class Helper {
public void SetAlarm(Activity activity, int requestCode, Calendar calendar, String title, ArrayList<PendingIntent> intentArray) {
AlarmManager alarmManager = (AlarmManager)activity.getSystemintent(Context.ALARM_intent);
Intent intent = new Intent(activity.getBaseContext(), MyReceiver.class);
intent.putExtra("title",title);
PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, requestCode, intent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
intentArray.add(pendingIntent);
}
}
// Delete Alarm
public class MyActivity extends Activity {
ProgressDialog progress;
// ...
public void Delete(int requestCode , String title) {
progress = ProgressDialog.show(this, getString(R.string.title), getString(R.string.text), true);
new Thread(new Runnable() {
@Override
public void run()
{
// ....
runOnUiThread(new Runnable() {
@Override
public void run()
{
try {
Intent intent = new Intent(getBaseContext(), MyReceiver.class);
intent.putExtra("title",title); // don't know if really needed
AlarmManager alarmManager = (AlarmManager)getSystemintent(Context.ALARM_intent);
PendingIntent pi = PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pi);
// Tried that also - didn't work:
// PendingIntent.getBroadcast(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT).cancel();
// pi.cancel();
}
catch(Exception e) {
// ...
}
progress.dismiss();
}
});
}
}).start();
}
}
// BroadcastReceiver
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent newIntent = new Intent(context, MyAlarmService.class);
newIntent.putExtra("title", intent.getExtras().getString("title"));
context.startService(newIntent);
}
}
public class MyAlarmService extends Service
{
// ...
@SuppressWarnings("static-access")
@Override
public int onStartCommand(Intent intent, int flag, int startId)
{
super.onStartCommand(intent, START_STICKY, startId);
mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 = new Intent(this.getApplicationContext(), MainActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity( this.getApplicationContext(),0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this.getApplicationContext())
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.conText))
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingNotificationIntent)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
mManager.notify(0, notification);
return START_STICKY;
}
}
取消意图必须与原始意图匹配(操作、数据、类型、类和类别相同)。您是否尝试过在没有标志的情况下调用 PendingIntent.getBroadcast()?(0 而不是 PendingIntent.FLAG_UPDATE_CURRENT)。并确保您使用相同的请求代码。
像这样创建闹钟:
public static void createAlarm(Context context, Calendar calAlarm, String ALARM_ACTION_NAME)
{
try
{
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// Create an alarm intent
Intent alarmIntent = new Intent(ALARM_ACTION_NAME);
// Create the corresponding PendingIntent object
PendingIntent alarmPI = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
// cancel any alarms previously set
alarmMgr.cancel(alarmPI);
// Register the alarm with the alarm manager
alarmMgr.set(AlarmManager.RTC_WAKEUP, calAlarm.getTimeInMillis(), alarmPI);
}
catch (Exception e)
{
e.printStackTrace();
}
}
你可以像这样取消它:
public static void cancelAlarm(Context context, String ALARM_ACTION_NAME)
{
try
{
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// Create an alarm intent
Intent alarmIntent = new Intent(ALARM_ACTION_NAME);
// Create the corresponding PendingIntent object
PendingIntent alarmPI = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
// cancel any alarms previously set
alarmMgr.cancel(alarmPI);
}
catch (Exception e)
{
e.printStackTrace();
}
}