繁体   English   中英

这个 PendingIntent 警报怎么能取消?

[英]How could this PendingIntent alarm cancelled?

我已经设法理解这段代码。 此代码用于提醒应用程序。 这段代码的作用是设置和取消闹钟。 但是,我不知道新创建的引用如何取消现有的 PendingIntent。 请向我解释这段代码(execute 方法)。

这是代码:

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

}

警报管理器是一个 SystemService 。 您可以从任何上下文访问它,如果您有启动警报的未决意图。 你可以从那个pendingIntent 取消它。 只需看一下文档链接到文档

希望能帮助到你。

此代码取消警报,如下所示:

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

这不会取消PendingIntent ,它只是取消警报。

此代码永远不会设置多个闹钟,因为尝试设置第二个闹钟将自动取消第一个闹钟。 这是因为每次都使用相同的PendingIntent

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM