Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个悬挂式警报怎么能取消?_Java_Android_Alarmmanager_Android Pendingintent_Android Alarms - Fatal编程技术网

Java 这个悬挂式警报怎么能取消?

Java 这个悬挂式警报怎么能取消?,java,android,alarmmanager,android-pendingintent,android-alarms,Java,Android,Alarmmanager,Android Pendingintent,Android Alarms,我已经设法理解了这个代码。此代码用于提醒应用程序。此代码的作用是设置和取消报警。但是,我不知道新创建的引用如何取消现有的pendingent。请给我解释一下这个代码(execute方法) 代码如下: public class AlarmService extends IntentService { private static final String TAG = "AlarmService"; public static final String POPULATE = "P

我已经设法理解了这个代码。此代码用于提醒应用程序。此代码的作用是设置和取消报警。但是,我不知道新创建的引用如何取消现有的pendingent。请给我解释一下这个代码(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();      
    }

}
公共类AlarmService扩展了IntentService{
私有静态最终字符串标记=“AlarmService”;
公共静态最终字符串POPULATE=“POPULATE”;
公共静态最终字符串CREATE=“CREATE”;
公共静态最终字符串CANCEL=“CANCEL”;
私有意图过滤器匹配器;
公共服务{
超级(标签);
matcher=newintentfilter();
matcher.addAction(填充);
matcher.addAction(创建);
matcher.addAction(取消);
}
@凌驾
受保护的手部内容无效(意图){
String action=intent.getAction();
字符串alarmId=intent.getStringExtra(AlarmMsg.COL\u alarmId);
字符串alarmMsgId=intent.getStringExtra(AlarmMsg.COL_ID);
String startTime=intent.getStringExtra(Alarm.COL\u FROMDATE);
String endTime=intent.getStringExtra(Alarm.COL\u TODATE);
if(匹配器匹配动作(动作)){
if(填充等于(操作)){
ememptime.dbHelper.populate(Long.parseLong(alarmId),ememptime.db);
执行(创建、报警ID);
}
if(创建.等于(操作)){
执行(创建、alarmId、alarmMsgId、开始时间、结束时间);
}
if(取消等于(动作)){
执行(取消、alarmId、alarmMsgId、开始时间、结束时间);
ememptime.dbHelper.shresd(ememptime.db);
}           
}
}
/**
*@param动作
*@param args{alarmId,alarmMsgId,startTime,endTime}
*/ 
私有void execute(字符串操作、字符串…args){
意图一;
悬垂性π;
AlarmManager am=(AlarmManager)getSystemService(Context.ALARM\u服务);
光标c;
字符串alarmId=(args!=null&&args.length>0)?args[0]:null;
字符串alarmMsgId=(args!=null&&args.length>1)?args[1]:null;
字符串startTime=(args!=null&&args.length>2)?args[2]:null;
字符串结束时间=(args!=null&&args.length>3)?args[3]:null;
字符串状态=取消。等于(操作)?AlarmMsg.CANCELLED:AlarmMsg.ACTIVE;
如果(alarmMsgId!=null){
c=ememptime.db.query(AlarmMsg.TABLE_NAME,null,AlarmMsg.COL_ID+“=?”,新字符串[]{alarmMsgId},null,null,null);
}否则{
c=AlarmMsg.list(emememptime.db、alarmId、开始时间、结束时间、状态);
}
if(c.moveToFirst()){
long now=System.currentTimeMillis();
时间长,差异大;
//long count=c.getCount();
//double MAX=alarmId!=null&&count>30?Util.MONTH:Util.YEAR;
做{
i=新意图(此为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=pendingent.getBroadcast(this,0,i,pendingent.FLAG_UPDATE_CURRENT);
//pi=pendingent.getService(上下文、请求代码、意图、标志);
time=c.getLong(c.getColumnIndex(AlarmMsg.COL_DATETIME));
diff=当前时间+(长)Util.MIN;
if(创建.等于(操作)){
如果(差异>0&&diff
报警管理器是一种系统服务。您可以从任何上下文访问它,如果您有启动报警的挂起意图。你可以把它从挂帐上取消。 请看一下文档


希望有帮助。

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

            } else if (CANCEL.equals(action)) {
                am.cancel(pi);
这不会取消挂起内容,它只是取消报警


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

但是,从do while循环检索到的pendingent每次迭代都指向相同的pendingent。在pendingent.getBroadcast(this,0,i,pendingent.FLAG_UPDATE_CURRENT),每次迭代的请求代码都是0。这不应取消或设置不同的报警时间。你能解释一下吗?如果(alarmMsgId!=null){c=Emildmame.db.query(AlarmMsg.TABLE_NAME,null,AlarmMsg.COL_ID+“=?”,新字符串[]{alarmMsgId},null,null,null);}否则{c=AlarmMsg.list(Emildmame.db,alarmId,startTime,endTime,status);}通过这一部分,我可以猜测是否有任何特定的报警ID,它将只返回一行,因此将取消一个报警,否则它将返回从开始到结束设置了报警的行列表,并且游标(moveToNext())将在该时间跨度内遍历所有行,并取消该时间间隔内的所有报警。现在我得到了它。谢谢。