0

在我的活動中,我設置了時間讓AlarmManager生成未來日期的通知,並將信息存儲在sqlite數據庫中。通過更改id來通知notificationManager來設置多個通知後,我在ListView中顯示信息。取消通知已經使用AlarmManager和BroadCast接收器設置

現在我想取消或刪除一些通知。例如,我爲1小時後的通知設置了時間,我想通過listview的longitemclick取消它,但會生成通知。

我看到了如何從通知欄取消通知但不適合我的情況。我想在通知生成之前取消通知。

我該如何做到這一點?

這裏是我打電話通知代碼:

custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() { 

       @Override 
       public void onCancel() { 
        finish(); 
       } 


       @Override 
       public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName, 
          String monthShortName, int monthNumber, int date, 
          String weekDayFullName, String weekDayShortName, 
          int hour24, int hour12, int min, int sec, 
          String AM_PM) { 

         Calendar calendar = Calendar.getInstance(); 
         calendar.set(year, monthNumber, date, hour24, min, 0); 

         long when = calendar.getTimeInMillis();   // notification time 


         myIntent = new Intent(noticall.this, MyReceiver.class); 
         pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0); 

         alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
         alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 


     Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year; 
     Time = hour12 + ":" + min + " " + AM_PM; 


     setlisto(Date); 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent);  

     Toast.makeText(noticall.this,"Record Added", Toast.LENGTH_SHORT).show(); 

      } 
    });  

MYRECIEVER類:

public class MyReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     /*Intent service1 = new Intent(context, MyAlarmService.class); 
     context.startService(service1);*/ 

     Log.i("App", "called receiver method"); 
     try{ 
      Utils.generateNotification(context); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

utils的類:

public class Utils { 

    //int k = noticall.in2; 

    static int i=0; 
    static long[] vibrate = { 1000, 1000, 1000, 1000, 1000 }; 
    public static NotificationManager mManager; 

    @SuppressWarnings("static-access") 
    public static void generateNotification(Context context){ 




     mManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); 
     int j=i+=1; 
     Intent intent1 = new Intent(context,Sipdroid.class); 
     Notification notification = new Notification(R.drawable.yel1," NOTIFICATION!", System.currentTimeMillis()); 
     notification.defaults |= Notification.DEFAULT_SOUND; 
     notification.defaults |= Notification.DEFAULT_VIBRATE; 
     notification.defaults |= Notification.DEFAULT_LIGHTS; 

     intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingNotificationIntent = PendingIntent.getActivity(context,0, intent1,PendingIntent.FLAG_UPDATE_CURRENT); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     notification.setLatestEventInfo(context, "xxxx", "xx "+noticall.Names, pendingNotificationIntent); 
     Log.i("increeeee", noticall.incre+""); 
     mManager.notify(j, notification); // for multiple notifications... change 0 to no of notification.... 
    } 

} 

在我的這個活動,我想取消設置的通知:

this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 
        public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) { 
         Log.w("DELETED", " DELETED"); 

     // code here to delete specific notification or pendingIntent or alarmmanager 


    } 
       }); 

我想這代碼,但它的工作對取消所有待處理的意圖取消我想取消特定pendingIntents:

public void unsetAlarm(View v) { 
      myIntent = new Intent(noticall.this, MyReceiver.class); 
       pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0); 

       alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

       alarmManager.cancel(pendingIntent); 
      Log.v("ahooooo", "cancelling notification"); 
     } 

如何取消特定的pendingIntents?

回答

0

好吧,我得到了解決我的問題我自己。我們可以創建一個pendingIntents管理多個的PendingIntent

public void setAlarm(long timu,int id2){ 

       myIntent = new Intent(noticall.this, MyReceiver.class); 
       pendingIntent = PendingIntent.getBroadcast(noticall.this, id2, myIntent,0); 

       alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmManager.set(AlarmManager.RTC, timu, pendingIntent); 


     } 


     public void unsetAlarm(View v,int id) { 


       myIntent = new Intent(noticall.this, MyReceiver.class); 
       pendingIntent = PendingIntent.getBroadcast(noticall.this, id, myIntent,0); 

       alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

       alarmManager.cancel(pendingIntent); 

     } 

我已經分配相同的ID,以及刪除我讀分配的ID並取消alarmManager以關閉通知它會觸發之前。

as`pendingIntent = PendingIntent。getBroadcast(this,id,myIntent,0);

id是PendingIntent的requestCode,我們可以跟蹤它並取消所需的PendingIntent,只是傳遞一個您想取消的ID。

可能會幫助某人。乾杯。快樂的Android編碼。

1

您無法從警報管理器獲取實際待處理的意圖,但您可以取消它。 重新創建與您之前使用的完全相同的數據和標識的意圖,然後傳遞意圖取消AlarmManager的功能,這將允許您取消通知。

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
manager.cancel(pendingIntent); 

其中pendingIntent是您要取消的意圖。

一些鏈接指: - How to get and cancel a PendingIntent?

Cancelling a PendingIntent

+0

我可以保留我正在設置的待處理意圖的記錄,以後我可以取消只需要取消那些我想要的?有可能嗎?你能告訴我一個例子嗎? –