2017-06-15 149 views
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应该与创建时使用的匹配,我忘了这一点。 –