-1

Bu kodu anladım. Bu kod bir hatırlatma uygulamasında kullanılır. Bu kodun yaptığı alarmı ayarlamak ve iptal etmektir. Bununla birlikte, yeni oluşturulan referansın mevcut PendingIntent'i nasıl iptal edebileceğini bilmiyorum. Lütfen bana bu kodu açıkla (yürütme yöntemi).Bu PendingIntent alarmı nasıl iptal edildi?

İşte kod:

public class AlarmService extends IntentService { 

    private static final String TAG = "AlarmService"; 

    public static final String POPULATE = "POPULATE"; 
    public static final String CREATE = "CREATE"; 
    public static final String CANCEL = "CANCEL"; 

    private IntentFilter matcher; 

    public AlarmService() { 
     super(TAG); 
     matcher = new IntentFilter(); 
     matcher.addAction(POPULATE); 
     matcher.addAction(CREATE); 
     matcher.addAction(CANCEL); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     String action = intent.getAction(); 
     String alarmId = intent.getStringExtra(AlarmMsg.COL_ALARMID); 
     String alarmMsgId = intent.getStringExtra(AlarmMsg.COL_ID); 
     String startTime = intent.getStringExtra(Alarm.COL_FROMDATE); 
     String endTime = intent.getStringExtra(Alarm.COL_TODATE); 

     if (matcher.matchAction(action)) { 
      if (POPULATE.equals(action)) { 
       RemindMe.dbHelper.populate(Long.parseLong(alarmId), RemindMe.db); 
       execute(CREATE, alarmId); 
      } 

      if (CREATE.equals(action)) { 
       execute(CREATE, alarmId, alarmMsgId, startTime, endTime); 
      } 

      if (CANCEL.equals(action)) { 
       execute(CANCEL, alarmId, alarmMsgId, startTime, endTime); 
       RemindMe.dbHelper.shred(RemindMe.db); 
      }   
     } 
    } 

    /** 
    * @param action 
    * @param args {alarmId, alarmMsgId, startTime, endTime} 
    */ 
    private void execute(String action, String... args) {  
     Intent i; 
     PendingIntent pi;    
     AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Cursor c; 

     String alarmId = (args!=null && args.length>0) ? args[0] : null; 
     String alarmMsgId = (args!=null && args.length>1) ? args[1] : null; 
     String startTime = (args!=null && args.length>2) ? args[2] : null; 
     String endTime = (args!=null && args.length>3) ? args[3] : null; 

     String status = CANCEL.equals(action) ? AlarmMsg.CANCELLED : AlarmMsg.ACTIVE; 

     if (alarmMsgId != null) { 
      c = RemindMe.db.query(AlarmMsg.TABLE_NAME, null, AlarmMsg.COL_ID+" = ?", new String[]{alarmMsgId}, null, null, null); 

     } else { 
      c = AlarmMsg.list(RemindMe.db, alarmId, startTime, endTime, status); 
     } 

     if (c.moveToFirst()) { 
      long now = System.currentTimeMillis(); 
      long time, diff; 
//   long count = c.getCount(); 
//   double MAX = alarmId!=null && count>30 ? Util.MONTH : Util.YEAR; 
      do { 
       i = new Intent(this, AlarmReceiver.class); 
       i.putExtra(AlarmMsg.COL_ID, c.getLong(c.getColumnIndex(AlarmMsg.COL_ID))); 
       i.putExtra(AlarmMsg.COL_ALARMID, c.getLong(c.getColumnIndex(AlarmMsg.COL_ALARMID))); 

       pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 
//    pi = PendingIntent.getService(context, requestCode, intent, flags); 

       time = c.getLong(c.getColumnIndex(AlarmMsg.COL_DATETIME)); 
       diff = time-now + (long)Util.MIN; 
       if (CREATE.equals(action)) { 
        if (diff > 0 && diff < Util.YEAR) 
         am.set(AlarmManager.RTC_WAKEUP, time, pi); 
        //am.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, interval, operation); 

       } else if (CANCEL.equals(action)) { 
        am.cancel(pi); 
       }      
      } while(c.moveToNext()); 
     } 
     c.close();  
    } 

} 

cevap

0

Bu kod böyle alarmı iptal eder.

Bu kod hiçbir zaman birden fazla alarmı ayarlamayacaktır çünkü ikinci alarm ayarlama girişimleri otomatik olarak ilkini iptal edecektir. Bunun nedeni her zaman aynı PendingIntent'un kullanılmasıdır.

+0

Şimdi anlıyorum. Çok teşekkürler. – rakifsul

0

Alarm Manager SYSTEMSERVICE olduğunu. Herhangi bir bağlamdan erişebilir ve Alarmı başlattığınız bekleyen bir niyetiniz varsa. Bunu o pendingIntent'ten iptal edebilirsiniz. Sadece belgelere bir göz atın. Sadece alarm iptal eder

  } else if (CANCEL.equals(action)) { 
       am.cancel(pi); 

Bu PendingIntent iptal etmez:

+0

Ancak, do-while döngüsünden alınan PendingIntent, her yineleme aynı PendingIntent işaret eder. PendingIntent.getBroadcast'de (bu, 0, i, PendingIntent.FLAG_UPDATE_CURRENT), istek kodu her yineleme 0'dır. Bu, farklı bir alarm süresini iptal etmemeli veya ayarlamamalıdır. Bunu açıklar mısınız? – rakifsul

+0

if (alarmMsgId! = Null) { c = RemindMe.db.query (AlarmMsg.TABLE_NAME, null, AlarmMsg.COL_ID + "=?", Yeni String [] {alarmMsgId}, null, null, null); } else { c = AlarmMsg.list (RemindMe.db, alarmId, startTime, endTime, durum); } Bu bölümle, belirli bir alarm kimliği olup olmadığını tahmin edebilirim, sadece bir satır geri dönecek ve dolayısıyla bir alarmı iptal edecektir, aksi halde alarm başlangıcından bitiş zamanına ve imlecin sonuna kadar ayarlanan satırların listesini döndürecektir (moveToNext()) o zaman aralığında tüm satırları iyice yineleyecek ve o zaman arasındaki tüm alarmları iptal edecektir. –

İlgili konular