如何设置 AlarmManager 对于必须每天重复多次的通知
How to Set AlarmManager For notification that has to be repeated multiple times a day and everyday
我可以为每 24 小时触发一次的警报设置 AlarmManager :
Calendar c= Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY,holder.hours);
c.set(Calendar.MINUTE,holder.min);
Intent in=new Intent(Reminder_entry.this,Notificationservice.class);
in.putExtra("name",holder.name);
PendingIntent pi=PendingIntent.getService(Reminder_entry.this, holder.pi, in,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManageram=AlarmManager)Reminder_entry.this.getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 1000 * 60 * 60 *24,pi);
但我无法将其设置为每天每 6 小时和每天重复一次。
我的研究表明我将不得不使用菊花链警报,所以如果警报响起我必须设置为第二天。你能帮我理解如何做到这一点吗?当警报被触发并且我的未决意图被处理时,我该如何重置警报,因为我的未决意图正在调用服务,而我不知道如何在服务中设置警报。
这是我的服务:
public class Notificationservice extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String name=intent.getStringExtra("name");
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Intent i=new Intent(Notificationservice.this,Notification_landing.class);
PendingIntent pi=PendingIntent.getActivity(Notificationservice.this, 0, i,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b= new NotificationCompat.Builder(Notificationservice.this);
b.setAutoCancel(true).setContentTitle(name).setContentText("time to take "+name).setSmallIcon(R.drawable.ic_launcher).setSound(soundUri);
b.setContentIntent(pi);
Notification n=b.build();
NotificationManager nm=(NotificationManager)Notificationservice.this.getSystemService(NOTIFICATION_SERVICE);
nm.notify(1,n);
return super.onStartCommand(intent, flags, startId);
}}
我最近也实现了一个带有警报的服务,但我不会自称是专家,所以更有经验的用户可能不同意我的方法。
在我的服务中,我在 onHandleIntent()
方法中完成了大部分真正的 "work",该方法被 IntentService
覆盖
对于你的情况,我认为这是一个问题,当你想要它再次 运行 时,再设置一个 6 小时的闹钟。例如:
@Override
protected void onHandleIntent(Intent intent) {
// do the work that needs to be done every 6 hours
someWork();
// Now create a new PendingIntent and associate it with an alarm for 6 hours time
// This example uses the current Intent and replays it but you could
// modify it if you need to perform something different next time.
PendingIntent pIntent = PendingIntent.getService(this, 1234, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// Find out system time in milliseconds for 6 hours in the future
long scheduledTime = System.currentTimeMillis() + (6 * 60 * 60 * 1000);
// Set the alarm. Note that this version is using RTC - there are other options,
// read the docs for more info:
// developer.android.com/reference/android/app/AlarmManager.html
am.set(AlarmManager.RTC, scheduledTime, pIntent);
}
请注意,我选择不使用 Calendar
来计算警报的未来时间 - 我认为仅使用以毫秒为单位的系统时间不那么尴尬。
更新 - 一些补充意见
- 从你的代码中,我看到你正在从
Service
扩展 - 我认为从 IntentService
扩展更容易,因为 Android 已经实现了更多的关键功能你这样覆盖 onHandleIntent(Intent)
或多或少就是你需要做的。
- 我上面的回答使用
AlarmManager
而不是 NotificationManager
但我认为菊花链的原理保持不变。
我可以为每 24 小时触发一次的警报设置 AlarmManager :
Calendar c= Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY,holder.hours);
c.set(Calendar.MINUTE,holder.min);
Intent in=new Intent(Reminder_entry.this,Notificationservice.class);
in.putExtra("name",holder.name);
PendingIntent pi=PendingIntent.getService(Reminder_entry.this, holder.pi, in,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManageram=AlarmManager)Reminder_entry.this.getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 1000 * 60 * 60 *24,pi);
但我无法将其设置为每天每 6 小时和每天重复一次。 我的研究表明我将不得不使用菊花链警报,所以如果警报响起我必须设置为第二天。你能帮我理解如何做到这一点吗?当警报被触发并且我的未决意图被处理时,我该如何重置警报,因为我的未决意图正在调用服务,而我不知道如何在服务中设置警报。
这是我的服务:
public class Notificationservice extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String name=intent.getStringExtra("name");
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Intent i=new Intent(Notificationservice.this,Notification_landing.class);
PendingIntent pi=PendingIntent.getActivity(Notificationservice.this, 0, i,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b= new NotificationCompat.Builder(Notificationservice.this);
b.setAutoCancel(true).setContentTitle(name).setContentText("time to take "+name).setSmallIcon(R.drawable.ic_launcher).setSound(soundUri);
b.setContentIntent(pi);
Notification n=b.build();
NotificationManager nm=(NotificationManager)Notificationservice.this.getSystemService(NOTIFICATION_SERVICE);
nm.notify(1,n);
return super.onStartCommand(intent, flags, startId);
}}
我最近也实现了一个带有警报的服务,但我不会自称是专家,所以更有经验的用户可能不同意我的方法。
在我的服务中,我在 onHandleIntent()
方法中完成了大部分真正的 "work",该方法被 IntentService
对于你的情况,我认为这是一个问题,当你想要它再次 运行 时,再设置一个 6 小时的闹钟。例如:
@Override
protected void onHandleIntent(Intent intent) {
// do the work that needs to be done every 6 hours
someWork();
// Now create a new PendingIntent and associate it with an alarm for 6 hours time
// This example uses the current Intent and replays it but you could
// modify it if you need to perform something different next time.
PendingIntent pIntent = PendingIntent.getService(this, 1234, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// Find out system time in milliseconds for 6 hours in the future
long scheduledTime = System.currentTimeMillis() + (6 * 60 * 60 * 1000);
// Set the alarm. Note that this version is using RTC - there are other options,
// read the docs for more info:
// developer.android.com/reference/android/app/AlarmManager.html
am.set(AlarmManager.RTC, scheduledTime, pIntent);
}
请注意,我选择不使用 Calendar
来计算警报的未来时间 - 我认为仅使用以毫秒为单位的系统时间不那么尴尬。
更新 - 一些补充意见
- 从你的代码中,我看到你正在从
Service
扩展 - 我认为从IntentService
扩展更容易,因为 Android 已经实现了更多的关键功能你这样覆盖onHandleIntent(Intent)
或多或少就是你需要做的。 - 我上面的回答使用
AlarmManager
而不是NotificationManager
但我认为菊花链的原理保持不变。