-1

私はこのコードを理解することができました。このコードはリマインダーアプリで使用されます。このコードが行うことは、アラームを設定したり解除したりすることです。しかし、私は新しく作成された参照が既存のPendingIntentをどのように取り消すことができるか分かりません。このコード(実行方法)を教えてください。ここでこのPendingIntentアラームはどのようにキャンセルできましたか?

はコードです:

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();  
    } 

} 

答えて

0

このコードは、このようなアラームをキャンセル:

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

これはPendingIntentをキャンセルしていない、それだけでアラームを解除します。

このコードでは、2つ目のアラームを設定しようとすると自動的に1つ目のアラームがキャンセルされるため、複数のアラームが設定されることはありません。毎回同じPendingIntentが使用されているためです。

+0

今私はそれを得る。どうもありがとう。 – rakifsul

0

アラームマネージャは、エコプリンティングです。アラームを開始した保留中のインテントがあれば、どのコンテキストからでもアクセスできます。そのpendingIntentからキャンセルできます。 ドキュメントをご覧ください。 Link to Document

希望します。

+0

ただし、do-whileループから取得されたPendingIntentは、繰り返しごとに同じPendingIntentを指します。 PendingIntent.getBroadcast(this、0、i、PendingIntent.FLAG_UPDATE_CURRENT)で、要求コードは繰り返しごとに0です。キャンセルしたり、別のアラーム時刻を設定するべきではありません。これを説明できますか? – rakifsul

+0

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); } 特定のアラームIDがあると推測できます.1行しか返さないため、1つのアラームをキャンセルします。それ以外の場合は、指定された開始時刻から終了時刻までのアラームが設定された行のリストを返します。カーソル(moveToNext() )は、その期間内のすべての行を徹底的に反復し、その時間の間のすべてのアラームをキャンセルします。 –

関連する問題