2012-01-25 39 views
3

我正在調度任務,並根據日期和時間添加報警管理器,並計劃任務正在添加一個列表..當我添加任何任務,然後它也添加到sqlite數據庫並分配一個用於報警管理器的pendinng意圖的唯一ID。根據UniqueID取消報警管理器掛起的意圖android

現在,如果我想解僱警報,那麼如果我從列表中刪除該行,那麼我也想關閉該特定警報也..我能夠從數據庫中刪除行,但如何解除設置該行的警報?

我的代碼如下:

   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; 
     } 
+0

您還可以檢查我的答案[這裏](http://stackoverflow.com/questions/8877365/cancelling-a-single-alarm-when-you - 有多重報警/ 8877875#8877875) –

回答

12

您可以檢索您的報警與創建的PendingIntent:

PendingIntent displayIntent = PendingIntent.getBroadcast(AddEditExpense.this, iUniqueId, intent, PendingIntent.FLAG_NO_CREATE); 

請務必使用t他保存在SQLite數據庫中的這個警報的唯一ID。 現在你應該取消的PendingIntent在AlarmManager並取消PendingIntent本身:

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

嗨Jansz ..如何取消它在廣播recievr的類? – shyam

+0

每個班級都一樣。獲取Intent的uniqueId並重新創建用於激活PendingIntent的Intent,PendingIntent.getBroadCast允許您從任何地方檢索PendingIntent。 – Janusz

+0

我想取消onContextItemSelected列表位置上的報警管理器位置單擊和我保存uniqueId在sqlite databse我發送時,當我創建鬧鐘..現在我試圖使用相同的ID內掛起的意圖但未能取消請參考我的代碼...以上.... – shyam

2

的問題是,你沒有提供的相同intent您何時取消pendingintent

在這裏你提到你的作爲行代碼來檢索pendingintent

PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i, 
          new Intent(),PendingIntent.FLAG_UPDATE_CURRENT); 

我發現您提供new Intent()而不是在第一次創建pendingintent時使用的intent

這樣的意圖應該是當你要取消pendingintent一樣,在你的情況下,將

Intent intent = new Intent(AddEditExpense.this, TimeAlarm.class) 

,我相信你在路過一個獨特的價值i,其也應該有參數在創建和取消pendingintent時具有相同的值。

欲瞭解更多信息,請 參考我的答案HERE