从服务中删除未决警报/通知

Delete a pending alarm / notification from service

我有一个 activity 调用助手,我在其中创建一个通知,该通知将在选定的时间弹出。效果很好。

我想在另一个 activity 中创建另一个函数,它可以在通知弹出之前删除待处理的警报。我尝试了很多在网上找到的方法,但没有任何效果。我做错了什么?

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

像这样创建闹钟:

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

取消意图必须与原始意图相匹配(操作、数据、类型、class 和类别相同)。您是否尝试过在没有标志的情况下调用 PendingIntent.getBroadcast() ? (0 而不是 PendingIntent.FLAG_UPDATE_CURRENT)。并确保您使用的是相同的请求代码。