2015-03-08 50 views
0

我有一个调用帮助器的活动,在那里创建一个通知,在选定的时间内弹出。它效果很好。从服务中删除待处理的警报/通知

我想在不同的活动中创建另一个功能,可以在通知弹出之前删除未决的警报。我尝试了很多我在网上找到的方式,但没有成功。我究竟做错了什么?

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

当您取消PendingIntent时,您需要提供相同的'Intent'。 – Machado 2015-03-10 19:57:07

+0

这是一个完全不同的活动。我如何使用相同的意图?我不能重新创建它吗? – TamarG 2015-03-10 20:08:58

+0

http://stackoverflow.com/questions/19593442/android-get-same-intent-from-different-activities – Machado 2015-03-10 20:12:00

回答

1

解除意图必须与原始(动作,数据类型,类和类别是相同的)。你有没有试图调用PendingIntent.getBroadcast()没有标志? (0代替PendingIntent.FLAG_UPDATE_CURRENT)。并确保您使用的是相同的请求代码。

+0

确实 - 我错误地使用了错误的requestCode,我没有注意到! – TamarG 2015-03-12 13:21:14

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

ALARM_ACTION_NAME是什么? – TamarG 2015-03-10 21:01:48

+0

是您用来创建闹钟的字符串... – Christian 2015-03-10 21:04:36

+0

您在哪里使用MyReciever?你在哪里创建通知? – TamarG 2015-03-10 21:22:38