0

编辑我的解决方案:我正在使用 Spinner 下拉列表来设置警报时间,却忘记onSelectItem了 Spinner 的方法不断地认为自己被选中,因此通过将警报放在该方法中,它会不断地触发。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(),这确实取消了警报,但它在警报完全触发之前取消了警报(这令人困惑,本以为它会在时间延迟后这样做)

那么我有什么理由错过这个警报反复触发的原因吗?

编辑以添加其他信息:我有一个按钮,用于发出 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);
            }
4

0 回答 0