目前我正在开发一个按月设置提醒的应用程序。我无法为警报管理员提供正确的重复间隔。请提供相同的信息。 这是我的代码,但这不会引起2月或30天的警报。 另外请提供代码来设置每年重复的alaram。
repeatTime=(AlarmManager.INTERVAL_DAY*31);
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, when.getTimeInMillis(), repeatTime, pi);
谢谢, 沙拉斯
答案 0 :(得分:6)
这就是你如何在一个月之后计算今天之间的间隔,使用这个逻辑在每次触发时重置警报。即将警报设置为您想要启动时的点,提供一些未决意图,一旦警报触发使用下面的代码获得下一个触发时间,并再次设置警报以在此时触发。
private long getDuration(){
// get todays date
Calendar cal = Calendar.getInstance();
// get current month
int currentMonth = cal.get(Calendar.MONTH);
// move month ahead
currentMonth++;
// check if has not exceeded threshold of december
if(currentMonth > Calendar.DECEMBER){
// alright, reset month to jan and forward year by 1 e.g fro 2013 to 2014
currentMonth = Calendar.JANUARY;
// Move year ahead as well
cal.set(Calendar.YEAR, cal.get(Calendar.YEAR)+1);
}
// reset calendar to next month
cal.set(Calendar.MONTH, currentMonth);
// get the maximum possible days in this month
int maximumDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
// set the calendar to maximum day (e.g in case of fEB 28th, or leap 29th)
cal.set(Calendar.DAY_OF_MONTH, maximumDay);
long thenTime = cal.getTimeInMillis(); // this is time one month ahead
return (thenTime); // this is what you set as trigger point time i.e one month after
}
答案 1 :(得分:2)
要设置每月重复一次的闹钟,
Calendar calender= Calendar.getInstance(TimeZone.getDefault());
int cDay = calender.get(Calendar.DAY_OF_MONTH);
calender.set(Calendar.HOUR_OF_DAY, hour); //hour you have selected
calender.set(Calendar.MINUTE, min); //min you have selected
calender.set(Calendar.SECOND, 0);
calender.set(Calendar.MILLISECOND, 0);
calender.set(Calendar.DATE, cDay);
calender.get(Calendar.MONTH);
Calendar now = Calendar.getInstance();
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
int days = now.getActualMaximum(Calendar.DAY_OF_MONTH);
if (calender.before(now)) { //this condition is used for future alarm only
calender.add(Calendar.DATE, days);
}
final int _id = (int) System.currentTimeMillis();
Intent i = new Intent(activity, YourServiceClass.class);
i.putExtra("type", "month");
PendingIntent displayIntent = PendingIntent.getBroadcast(
activity, _id, i, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), AlarmManager.INTERVAL_DAY * calender.getActualMaximum(Calendar.DAY_OF_MONTH), displayIntent);
现在在您的服务类中,在代码下方
if (intent.getExtras() != null) {
type = intent.getStringExtra("type");
}
if (type != null) {
if (type.equals("month")) {
Long futureTimeDifference = intent.getLongExtra("futureTimeDifference", 0); // Receive the time difference in milliseconds from currenttime in milliseconds and the future set date milliseconds
futureTimeDifference = futureTimeDifference + System.currentTimeMillis();// get the next schedule date time inmilliseconds
String repeatType = intent.getStringExtra("getRepeatType");// Receive the repeat type
Date todaysDate = new Date();// initialize a new date object
Calendar getCurrentDate = Calendar.getInstance();// Initialize a new Calendar object
getCurrentDate.setTime(todaysDate); //Set the calendar to todays date
int currentMonth = getCurrentDate.get(Calendar.MONTH); // Assign the current month in integer
if (currentMonth == Calendar.JANUARY || currentMonth == Calendar.MARCH || currentMonth == Calendar.MAY || currentMonth == Calendar.JULY || currentMonth == Calendar.AUGUST || currentMonth == Calendar.OCTOBER || currentMonth == Calendar.DECEMBER) {
futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 31);
}
if (currentMonth == Calendar.APRIL || currentMonth == Calendar.JUNE || currentMonth == Calendar.SEPTEMBER || currentMonth == Calendar.NOVEMBER) {
futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 30);
}
if (currentMonth == Calendar.FEBRUARY) {//for february month)
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
if (cal.isLeapYear(cal.get(Calendar.YEAR))) {//for leap year february month
futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 29);
} else { //for non leap year february month
futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 28);
}
}
final int monthly_id = (int) System.currentTimeMillis();
Log.e("MonthlyNotification", futureTimeDifference + "");
PendingIntent displayIntent = PendingIntent.getBroadcast(
context, monthly_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, futureTimeDifference, displayIntent);
//Toast.makeText(context, "Notification Set Monthly", Toast.LENGTH_SHORT).show();
}
}
答案 2 :(得分:0)
每年重复警报
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
if(cal.isLeapYear(year)){
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 366, alarmIntent);
}else{
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 365, alarmIntent);
}
答案 3 :(得分:0)
感谢Techfist ..例如:dateValue =" 30/01/2017 11:02" ...从数据库中获取id和日期......
private void getMonthlyDuration(Context context,int id,String dateValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences("ModernDiary", Context.MODE_PRIVATE);
String dateOfMonth = sharedPreferences.getString("day"+id,DateFormat.format("dd", Calendar.getInstance()).toString());
Calendar calendar = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault());
try {
Date dateMain = simpleDateFormat.parse(dateValue);
calendar.setTime(dateMain);
} catch (ParseException e) {
e.printStackTrace();
}
Boolean isSetDate = false;
if (sharedPreferences.getInt("monthInc"+id,-1) != -1) {
calendar.set(Calendar.MONTH,sharedPreferences.getInt("monthInc"+id,calendar.get(Calendar.MONTH)));
calendar.set(Calendar.YEAR,sharedPreferences.getInt("yearInc"+id,calendar.get(Calendar.YEAR)));
if (calendar.getActualMaximum(Calendar.DAY_OF_MONTH) < Integer.parseInt(dateOfMonth)) {
calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
Log.i("timeDay",dateOfMonth+" "+calendar.getTime()+" max");
} else {
calendar.set(Calendar.DATE,Integer.parseInt(dateOfMonth));
Log.i("timeDay",dateOfMonth+" "+calendar.getTime()+"min");
}
if (sharedPreferences.getInt("monthInc"+id,calendar.get(Calendar.MONTH)) < calendar.get(Calendar.MONTH)){
calendar.add(Calendar.MONTH, -1);
isSetDate = true;
Log.i("timeMonth","Increment "+calendar.getTime());
} else {
isSetDate = false;
Log.i("timeMonth","No Change");
}
}
calendar.add(Calendar.MONTH, 1);
if (isSetDate){
if (calendar.getActualMaximum(Calendar.DAY_OF_MONTH) < Integer.parseInt(dateOfMonth)) {
calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
} else {
calendar.set(Calendar.DATE,Integer.parseInt(dateOfMonth));
}
}
Log.i("timeAf",calendar.getTime()+"");
sharedPreferences.edit().putInt("monthInc"+id, calendar.get(Calendar.MONTH)).apply();
sharedPreferences.edit().putInt("yearInc"+id, calendar.get(Calendar.YEAR)).apply();
Intent notificationIntent = new Intent(context,AlarmBroadcastReceiver.class);
Bundle bundle = new Bundle();
bundle.putSerializable("alarm", id);
notificationIntent.putExtra("bundle", bundle);
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
broadcast = PendingIntent.getBroadcast(context, id, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcast);
}
警报触发时间:
Tue Feb 28 11:02:00 GMT+05:30 2017
Thu Mar 30 11:02:00 GMT+05:30 2017
Sun Apr 30 11:02:00 GMT+05:30 2017
Tue May 30 11:02:00 GMT+05:30 2017
Fri Jun 30 11:02:00 GMT+05:30 2017
Sun Jul 30 11:02:00 GMT+05:30 2017
Wed Aug 30 11:02:00 GMT+05:30 2017
Sat Sep 30 11:02:00 GMT+05:30 2017
Mon Oct 30 11:02:00 GMT+05:30 2017
Thu Nov 30 11:02:00 GMT+05:30 2017
Sat Dec 30 11:02:00 GMT+05:30 2017
Tue Jan 30 11:02:00 GMT+05:30 2018
Wed Feb 28 11:02:00 GMT+05:30 2018 ...
答案 4 :(得分:0)
您可以使用 set
然后重置广播接收器中的闹钟
在接收器中,简单地:
val c = Calendar.getInstance().apply { add(Calendar.MONTH, 1) }
// reset alarm here
val intent = Intent(context, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
context, 123, intent, 0
)
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?
alarmManager!!.set(
AlarmManager.RTC,
c.timeInMillis,
pendingIntent
)