0

我正在開發一個提醒應用程序,其中我使用sqlite將所有提醒 相關數據存儲在數據庫中,一切工作正常。使用AlarmManager取消鬧鐘

問題:

當我從數據庫中刪除,我還試圖把 報警斷行,但它不工作,我使用recyclerview。

請幫我找出我的代碼中有什麼問題。

這裏是我的代碼:

DataAdapter.java

dataAdapterViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int deleteRowId = context.getContentResolver().delete(RoutineContract.RoutinesEntry.CONTENT_URI, 
        rowSelection, rowSelectionArgs); 
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      Intent intent = new Intent(context, AlarmReceiver.class); 
      PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE); 
      if(alertIntent != null) { 
       alarmManager.cancel(alertIntent); 
       alertIntent.cancel(); 
       Log.e("row id", ""+rowId); 
      } 
     } 
    }); 

AddReminderActivity.java

  Uri insertUri = getContentResolver().insert(RoutineContract.RoutinesEntry.CONTENT_URI, contentValues); 
      int rowId = Integer.parseInt(insertUri.getLastPathSegment()); 

      Intent intent = new Intent(this, AlarmReceiver.class); 
      intent.setData(insertUri); 
      intent.putExtra("name", name); 
      intent.putExtra("repeatType", repeatType); 
      PendingIntent alertIntent = PendingIntent.getBroadcast(this, rowId, intent, PendingIntent.FLAG_ONE_SHOT); 
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); 

      alarmManager.set(AlarmManager.RTC_WAKEUP, dateTime.getTimeInMillis(), 
      pendingIntent); 

PS:我已經搜查計算器和發現解決問題的辦法但現在沒有人爲我工作。

回答

0

當您檢查alarmintent已與此代碼PendingIntent alertIntent = PendingIntent.getBroadcast(context, rowId, intent, PendingIntent.FLAG_NO_CREATE);你傳遞標誌PendingIntent.FLAG_NO_CREATE,如果找到,返回null存在,你可以閱讀更多here。 嘗試強似PendingIntent.FLAG_UPDATE_CURRENT

編輯:我嘗試調度和取消與你類似代碼的警報,它似乎工作,主要區別是傳遞給getBroadcast功能,我用它來獲得該標誌的意圖pendingIntent,在這兩種情況下FLAG_UPDATE_CURRENT。我用下面的代碼

public void scheduleAlarm() { 
     Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class); 
     notificationIntent.setAction(ACTION_NOTIFICATION); 

     long now = System.currentTimeMillis() + 5 * 1000; 

     AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, now, pendingIntent); 
} 
public void removeAlarm() { 
     Intent notificationIntent = new Intent(mContext, ScheduledActionReceiver.class); 
     notificationIntent.setAction(ACTION_NOTIFICATION); 

     AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, Constants.ALARM_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     alarmManager.cancel(pendingIntent); 
} 

編輯1:我想,我終於想通了,有一對夫婦更多的測試我注意到,如果把代碼 notificationIntent.setData(Uri.parse("uri to parse"));

此線時,我安排報警,取消行動不起作用,如果我不把它取消之前也取消它(另一方面設置額外似乎沒有任何區別)

+0

我也嘗試過使用FLAG_UPDATE_CURRENT和FLAG_ONE_SHOT,但那對我來說不起作用 –

+0

請參閱我編輯的答案,並嘗試添加setData(yourUri)時也取消報警 –

+0

感謝工作,它在文檔中提到,取消pendingIntent應該與創建時使用的匹配,我忘了這一點。 –