我在设置重复警报时遇到一些问题,该重复警报将在每个月或每两个月在特定日期(由用户输入)触发。 到目前为止,我正在使用服务进行通知,BroadcastReceiver以及待处理的Intent。我无法理解的是:
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 30*month, pendingIntent);
我们如何在这里设置功能以及它将如何影响电池寿命,还有其他任何事情(例如在数据库中存储日期并且仅在触发某些事件时调用它)等等。 1.Notification Service扩展服务
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
// Getting Notification Service
mManager = (NotificationManager) this.getApplicationContext()
.getSystemService(
this.getApplicationContext().NOTIFICATION_SERVICE);
/*
* When the user taps the notification we have to show the Home Screen
* of our App, this job can be done with the help of the following
* Intent.
*/
Intent intent1 = new Intent(this.getApplicationContext(), com.expandablelistItems.demo.adapter.DynamicActivity.class);
Notification notification = new Notification(R.drawable.ic_launcher,
"Payment of your demoReminder", System.currentTimeMillis());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(
this.getApplicationContext(), 0, intent1,
PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(this.getApplicationContext(),
"demo", "Payment of your demoReminder",
pendingNotificationIntent);
mManager.notify(0, notification);
}
2。重复方法
if (current_Month == Calendar.FEBRUARY){//for feburary month)
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
if(cal.isLeapYear(calendar.get(Calendar.YEAR))){//for leap year feburary month
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 29*month, pendingIntent);
Toast.makeText(getActivity(), "februry", Toast.LENGTH_SHORT).show();}
else{ //for non leap year feburary month
Toast.makeText(getActivity(), "feb", Toast.LENGTH_SHORT).show();
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 28*month, pendingIntent);
}
}
这是广播接收器
@Override
public void onReceive(Context context, Intent intent) {
// When our Alaram time is triggered , this method will be excuted (onReceive)
// We're invoking a service in this method which shows Notification to the User
Intent myIntent = new Intent(context, NotificationService.class);
context.startService(myIntent);
}
其中notificationService是第一个扩展服务的代码
答案 0 :(得分:3)
出于以下两个原因,您应该避免使用间隔为30天的SetRepeating
:
SetRepeating
不精确且功能类似于SetInexactRepeating
,这意味着可能会将警报转移到整个间隔持续时间(在您的情况下最多30天)。中所述
您的闹钟首次触发不会在请求的时间之前,但是 在此之后几乎整整一段时间内可能不会发生
set(int, long, PendingIntent)
并在每个实例后计算下一个警报。
答案 1 :(得分:2)
基本上,
其中一种方法是使用ScheduleThreadExecutor类但运行多个线程并使用AlarmManager我们可以提高性能。
您可以使用 Context.getSystemService(Context.ALARM_SERVICE),而不是创建AlarmManager实例,因为这是系统服务。 这将优化内存使用和电池寿命。
您还可以使用 setInexactRepeating 而不是setRepeating,这些警报更节能
有关详细信息,请访问http://developer.android.com/reference/android/app/AlarmManager.html
答案 2 :(得分:0)
如果您的设备已关闭,闹钟将会消失。我建议你在很长一段时间(比如一个月)之后使用一种alternet方式来触发一个动作。尝试提醒或日历活动。