2016-02-11 16 views
2

我正在使用報警管理器和廣播接收器設置通知。我試圖使用警報管理器的setInexactRepeating方法,但它不會在API 19上方的確切時間上報警。如何使用setExact設置重複鬧鈴以及如何取消同樣的動作?

所以我建議使用setExact方法並手動設置警報。我不知道我該怎麼做。我是否需要計算一年中每週的日期?

此外,我正在創建的報警我想刪除相同的,如果事件被刪除。我怎樣才能取消這個?使用取消方法我試圖取消警報。爲了測試,我嘗試設置多個警報並將其刪除。

如果我刪除了一個事件,那麼該事件的重要警報應該取消,但可能所有警報都會取消,因爲我在刪除事件後沒有收到任何通知。

我爲此使用了唯一標識。作爲最終的靜態int RQS_1 = 1;用於設置警報。

任何人都可以幫我解決這個問題嗎?

設置鬧鐘:

public void setNotificationTime(Calendar c) 
{ 

    Date dateFrom = new Date(); 
    df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy"); 
    try { 
     dateFrom = df.parse(startTime); 
    } 
    catch (ParseException ex) { 

    } 

    dateFrom.getTime(); 
    c.setTime(dateFrom); 

    hour = c.get(Calendar.HOUR_OF_DAY); 
    minute = c.get(Calendar.MINUTE); 


    if(notificationTime.equals("10 Minutes Before")) 
    { 


     c.set(Calendar.HOUR_OF_DAY, hour); 
     c.set(Calendar.MINUTE, minute - 10); 
     c.set(Calendar.SECOND, 0); 
     c.set(Calendar.MILLISECOND, 0); 
     c.set(Calendar.DATE, day); 
     // c.set(Calendar.DAY_OF_WEEK,); 

     SetDay(c); 

     notification = c.getTime(); 
     notificationTime = df.format(notification); 

     Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show(); 

     intent = new Intent(getBaseContext(),NotificationReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0); 
     alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent); 

    } 



    else if(notificationTime.equals("30 Minutes Before")) 
    { 

     c.set(Calendar.HOUR_OF_DAY, hour); 
     c.set(Calendar.MINUTE, minute - 30); 
     c.set(Calendar.SECOND, 0); 
     c.set(Calendar.MILLISECOND, 0); 
     c.set(Calendar.DATE, day); 
     // c.set(Calendar.DAY_OF_WEEK,); 

     SetDay(c); 

     notification = c.getTime(); 
     notificationTime = df.format(notification); 

     Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show(); 

     intent = new Intent(getBaseContext(),NotificationReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0); 
     alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent); 

    } 
} 

setDay方法我已經創建設置已經從一個對話框,設置日choosen用戶一天。

setDay功能:

public void SetDay(Calendar c) 
{ 
    switch (dayOfWeek) 
     { 
      case "Mon": 
       c.set(Calendar.DAY_OF_WEEK, 2); 
       c.getTime(); 
       Toast.makeText(getApplicationContext(),dayOfWeek,Toast.LENGTH_SHORT).show(); 
       break; 
      case "Tue": 
       c.set(Calendar.DAY_OF_WEEK, 3); 
       c.getTime(); 
       Toast.makeText(getApplicationContext(),dayOfWeek,Toast.LENGTH_SHORT).show(); 
       break; 

}

通知接收

public class NotificationReceiver extends BroadcastReceiver { 


    public static int MY_NOTIFICATION_ID = 0; 
    NotificationManager notificationManager; 
    Notification myNotification; 

    EventTableHelper db; 

    @Override 
    public void onReceive(Context context, Intent intent) { 


     Toast.makeText(context, "Time is set", Toast.LENGTH_LONG).show(); 

     db = new EventTableHelper(context); 

     List<EventData> testSavings = db.getAllEvents(); 

     for (EventData ts : testSavings) { 
      String log = "from date:" + ts.getFromDate() 
        + " ,to date: " + ts.getToDate() 
        + " ,location: " + ts.getLocation() 
        + " ,title " + ts.getTitle(); 

      Calendar c = Calendar.getInstance(); 
      Date date = new Date(); 
      Date date1 = new Date(); 
      Log.d("Result: ", log); 

      SimpleDateFormat df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy"); 
      SimpleDateFormat df2 = new SimpleDateFormat("hh:mm a"); 

      try { 
       date = df.parse(ts.getFromDate()); 
       date1 = df.parse(ts.getToDate()); 
      } catch (ParseException ex) { 

      } 
      String timeFrom = df2.format(date); 
     // String startTime = String.valueOf(timeFrom); 

      String timeTo = df2.format(date1); 
      // String endTime = String.valueOf(timeTo); 


      String location = ts.getLocation(); 
      String title = ts.getTitle(); 


      Intent myIntent = new Intent(context, MainActivity.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(
        context, 
        0, 
        myIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT); 

      if(location.equals("")) 
      { 
       String msg = "From : " + timeFrom + "\nTo : " + timeTo; 

       myNotification = new NotificationCompat.Builder(context) 
         .setContentTitle("Event : " + title) 
         .setContentText(msg) 
         .setWhen(System.currentTimeMillis()) 
         .setContentIntent(pendingIntent) 
         .setAutoCancel(true) 
         .setSmallIcon(R.drawable.eventicon) 
         .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
         .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) 
         .setDefaults(Notification.DEFAULT_SOUND) 
         .build(); 

      } 

      else 
      { 
       String msg = "From : " + timeFrom + "\nTo : " + timeTo + "\nAt : " + location; 
       myNotification = new NotificationCompat.Builder(context) 
         .setContentTitle("Event : " + title) 
         .setContentText(msg) 
         .setWhen(System.currentTimeMillis()) 
         .setContentIntent(pendingIntent) 
         .setAutoCancel(true) 
         .setSmallIcon(R.drawable.eventicon) 
         .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
         .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) 
         .setDefaults(Notification.DEFAULT_SOUND) 
         .build(); 

      } 

      Log.i("Notify", "Notification"); 
      notificationManager = 
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.notify(MY_NOTIFICATION_ID, myNotification); 

      myNotification.flags=Notification.FLAG_AUTO_CANCEL; 

     } 
    } 
} 

是忘了添加的代碼取消:

alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
           intent = new Intent(getApplicationContext(), NotificationReceiver.class); 
           pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), RQS_1, intent, 0); 
           alarmManager.cancel(pendingIntent); 

謝謝。

回答

2

這樣,

pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0); 
    alarmManager.cancel(pendingIntent); //Remove any alarms with a matching Intent 

更多信息AlarmManager

+0

是的,我已經做了同樣的..Please檢查編輯問題。那麼這是否會刪除尊重的警報?或所有警報? @Madhur – Sid

+0

它會刪除任何與匹配意圖警報檢查了這一點http://developer.android.com/reference/android/app/AlarmManager.html#cancel(android.app.PendingIntent) – Madhur

+0

我的代碼是否正確設置報警?我怎樣才能使用setExact方法設置? – Sid

相關問題