根据UniqueID取消Android的闹钟管理器挂起意图。

4
我正在根据日期和时间安排任务,并添加闹钟管理器。安排的任务将添加到列表中。当我添加任何任务时,它也会被添加到 SQLite 数据库中,并为闹钟管理器分配一个唯一的 ID。
现在,如果我想要解除闹钟,则如果我从列表中删除该行,则我也希望解除特定的闹钟。我能够从数据库中删除该行,但如何解除为该行设置的闹钟?
以下是我的代码:
               Button  AddData=(Button)findViewById(R.id.senddata);
        AddData.setOnClickListener(new View.OnClickListener()
        {
        public void onClick(View v) {
            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);                 
            int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

                Date= updatedate.getText().toString();
                Time= updateTime.getText().toString();
                Discripton= discription.getText().toString();
                //---get current date and time---
                Calendar calendar = Calendar.getInstance();       
                //---sets the time for the alarm to trigger---
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.DAY_OF_MONTH, day);                 
                calendar.set(Calendar.HOUR_OF_DAY, mHour);
                calendar.set(Calendar.MINUTE, mMinute);
                calendar.set(Calendar.SECOND, 0);
                Log.i("********####",year+"  ,"+month+" , "+day+" , "+mHour+" , "+mMinute+"----"+ calendar.getTimeInMillis());

                Intent intent = new Intent(AddEditExpense.this, TimeAlarm.class);
                //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                Bundle b12 = new Bundle();
                mStuffresults=Discripton;
                b12.putString("serverresponse", mStuffresults);
                intent.setAction("" + Math.random());
                intent.putExtras(b12);
                PendingIntent displayIntent = PendingIntent.getBroadcast(AddEditExpense.this,iUniqueId,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
                    alarmManager.set(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), displayIntent);

}
}

请参考这里:已更新。
  public boolean onContextItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case DELETE_ID:
                 UniqueId=AddEditExpense.s;
                 Log.i("UniqueId",UniqueId);
                    Integer i = Integer.valueOf(UniqueId);
                    PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                            new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);
                    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                    alarmManager.cancel(contentIntent);
                AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
                mDbHelper.deleteNote(info.id);
                fillData();

                return true;
        }

你也可以在这里查看我的答案:https://dev59.com/kmox5IYBdhLWcg3w74u3#8877875 - Lalit Poptani
2个回答

12
您可以使用以下代码检索为闹钟创建的PendingIntent:
PendingIntent displayIntent = PendingIntent.getBroadcast(AddEditExpense.this, iUniqueId, intent, PendingIntent.FLAG_NO_CREATE);

请确保使用在sqlite数据库中保存的唯一id来设置此闹钟。 现在,您应该取消AlarmManager中的PendingIntent并取消PendingIntent本身:

if(displayIntent != null) {
   alarmManager.cancel(displayIntent);
   displayIntent.cancel();  
}

嗨Jansz..如何在广播接收器类中取消它? - shyam
在每个类中都是相同的。获取Intent的uniqueId并重新创建用于激活PendingIntent的Intent,而PendingIntent.getBroadCast允许您从任何地方检索PendingIntent。 - Janusz
我正在尝试在列表位置单击时取消Alarm Manager的onContextItemSelected,并且我已经将uniqueId保存在SQLite数据库中,当我创建闹钟时会发送它。现在我正在尝试在pending intent中使用相同的id,但无法取消,请参考我的代码...上面的。 - shyam

2
问题在于,你在取消 pendingintent 时没有提供与创建时相同的 intent
这里,你提到了检索 pendingintent 的代码行。
PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                            new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);

我发现您提供了一个新的Intent(),而不是创建第一次pendingintent时使用的intent。所以当您要取消pendingintent时,intent应该保持一致,在您的情况下将是:
 Intent intent = new Intent(AddEditExpense.this, TimeAlarm.class)

我认为您正在将唯一值 i 传递给参数,而在创建和取消 pendingintent 时应该具有相同的值。

更多信息,请参考我的答案这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接