我有一个调用Helper的活动,在那里我创建了一个在选定时间弹出的通知。它很棒。
我想在另一个活动中创建另一个功能,可以在弹出通知之前删除待处理的警报。我尝试了许多在网上找到的方法但没有任何效果。我做错了什么?
// 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;
}
}
答案 0 :(得分:1)
取消意图必须与原始意图相匹配(动作,数据,类型,类别和类别相同)。您是否尝试在没有标志的情况下调用PendingIntent.getBroadcast()? (0而不是PendingIntent.FLAG_UPDATE_CURRENT)。并确保使用相同的请求代码。
答案 1 :(得分:0)
像这样创建你的警报:
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();
}
}