setAlarmClock()反复触发警报[问题出因是Spinner]

时间:2019-08-31 13:48:49

标签: android android-alarms setalarmclock

针对我的解决方案进行编辑:我正在使用Spinner下拉列表来设置警报时间,却忘记了Spinner的onSelectItem方法始终认为自己处于选中状态,因此将警报放入该方法中,它不断开火。 OP下方

我正在尝试建立每日通知系统。我使用AlarmManager在给定的时间推送通知,并且根据文档,我使用的方法应该只发出一次警报。但是,警报会反复发出,直到我完全杀死了该应用程序。

这是我的初始化资料:

alarmMgr = (AlarmManager)MainActivity.this.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

alarmInfo = new AlarmManager.AlarmClockInfo(cal.getTimeInMillis(), alarmIntent);

和我的AlarmReceiver类:

import static com.example.umbrellareminder.MainActivity.location_button;

public class AlarmReceiver extends BroadcastReceiver {
    private Context context;

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        location_button.performClick();
    }
}

({location_button是我用来运行http请求并推送通知的内容)

现在实际上要发出警报了,我已经尝试了

alarmMgr.setAlarmClock(alarmInfo,alarmIntent);

alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),alarmIntent);

但是,它们都反复运行。我还尝试添加一个包含alarmIntent.cancel()的延迟,该延迟确实会取消警报,但是会在警报完全触发之前取消警报(这令人困惑,以为会在延迟之后执行此操作)< / p>

那么我是否有任何原因想念为什么这个警报反复触发?

编辑以添加其他信息:我有一个按钮,用于发出http请求/获取一些要显示并用于通知的信息。警报本身设置在Spinner中的onItemSelectedListener(下拉列表是警报的可选时间的列表)中,如下所示:

Spinner time_list = findViewById(R.id.time_list);
        time_list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                remind_time = time_list.getSelectedItem().toString();

                int hour = Integer.parseInt(Character.toString(remind_time.charAt(0)));
                int minute = Integer.parseInt(remind_time.substring(2,3));

                Calendar cal = Calendar.getInstance();
                cal.setTimeInMillis(System.currentTimeMillis());
                cal.set(Calendar.HOUR_OF_DAY, 9);
                cal.set(Calendar.MINUTE, 25);
                cal.set(Calendar.SECOND, 45);

                if(cal.getTimeInMillis() <= System.currentTimeMillis()){
                    cal.add(Calendar.DAY_OF_MONTH, 1);
                }

                Log.d("TIME",cal.getTime().toString());
                alarmInfo = new AlarmManager.AlarmClockInfo(cal.getTimeInMillis(), alarmIntent);

                //line where I set the alarm
                alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY,alarmIntent);
            }

0 个答案:

没有答案