如何设置AlarmManager用于每天和每天必须重复多次的通知

时间:2015-04-06 07:53:42

标签: android notifications android-service alarmmanager reminders

我可以将AlarmManager设置为每24小时触发的警报:

    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小时和每天重复一次。 我的研究表明,我将不得不雏菊连接警报,所以如果一个人关闭,我必须设置为第二天。你能帮我理解这是怎么做到的吗?如何在触发警报时重置警报并处理我的待处理意图,因为我的待处理意图是调用A服务而我不知道如何在服务中设置警报。

这是我的服务:

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);
}}

1 个答案:

答案 0 :(得分:2)

我最近也实施了一项带闹钟的服务,但不会声称自己是专家,因此更有经验的用户可能不同意我的做法。

在我的服务中,我做了大部分真正的"工作"在从onHandleIntent()

重写的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来计算警报的未来时间 - 我认为使用系统时间(以毫秒为单位)不那么尴尬。

更新 - 其他一些评论

  1. 从您的代码中,我发现您从Service延伸 - 我认为从IntentService扩展更容易,因为Android已经为您实现了更多关键功能,因此覆盖onHandleIntent(Intent) 1}}或多或少都是你需要做的。
  2. 我上面的回答使用的是AlarmManager而不是NotificationManager,但我认为菊花链的原则仍然相同。