Android 将 AlarmManager 设置为在实际日期前 1 天从日历中通知不起作用

Android set AlarmManager to notification 1 day before real day from calenda not work

我想在日历的真实日期前 1 天设置闹钟通知。

这是我的代码。

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                        ContentValues cv = new ContentValues();
                        cv.put(DBHelper.COL_VEHICLE_TYPE, vt);
                        cv.put(DBHelper.COL_DATE, mDisplayDate.getText().toString());

                        db.update(DBHelper.TABLE_NAME, cv, "_id = ?",new String[]{rowId});
                        cursor.requery();

                        String[] parts = mDisplayDate.getText().toString().split("-");
                        String day = parts[0];
                        String month = parts[1];
                        String year = parts[2];
                        Calendar cal = Calendar.getInstance();
                        cal.set(Calendar.DAY_OF_YEAR, Integer.parseInt(day)-1);  //1-31
                        cal.set(Calendar.MONTH, Integer.parseInt(month));  //first month is 0!!! January is zero!!!
                        cal.set(Calendar.YEAR, Integer.parseInt(year));//year...

                        cal.set(Calendar.HOUR_OF_DAY,23);  //HOUR
                        cal.set(Calendar.MINUTE, 20);       //MIN
                        cal.set(Calendar.SECOND, 0);       //SEC

                        manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                        myIntent = new Intent(DriverLicenseActivity.this, AlarmNotificationReceiver.class);
                        pendingIntent = PendingIntent.getService(DriverLicenseActivity.this, 0,myIntent , 0);
                        manager.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),pendingIntent);


                        getData();


                    }
                })

我像这样使用 Integer.parseInt(day)-1 在实际日期之前设置日历。

cal.set(Calendar.DAY_OF_YEAR, Integer.parseInt(day)-1);

但是当我 运行 编码到时间 23.20 时,它没有显示任何内容。没有来自 android.

的通知

在您的评论中,您写道 DAY_OF_YEAR 的值为 (1-31)。然后使用该值减去 1(即 0-30)设置 DAY_OF_YEAR。

如果您阅读 Calendar.DAY_OF_YEAR 的文档,您会注意到它是 YEAR 中的天数(而不是 MONTH 中的天数)并且一年中的第一天是 1(不是 0)。所以 DAY_OF_YEAR 的值为 (1-366).

此外,您应该始终将日历值设置为从大到小。所以你应该设置 YEAR,然后是 MONTH,然后是 DAY_OF_MONTH(它的值是 1-31)。


注意:当日历出现问题时,输出您认为日历中的日期以确保它确实是您想要设置的日期是很有用的。你可以使用这样的东西来做到这一点: String formattedDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").format(calendar.getTime()); Log.v("tag","Date is " + 格式化日期);