Android设备重启后如何使用AlarmManager

30
我有一组闹钟需要在重启后继续使用。我尝试过在开机接收器上使用它们,但是它们不会重新启动。我不确定我是否理解了开机接收器以及如何重新启动所有的闹钟。我已经有一个用于我的通知的接收器,但不知道是否可以使用同一个接收器或者需要新的接收器?
有人能给我指点一些好的教程或帮助一下吗?
谢谢
    DatabaseHandler db = new DatabaseHandler(this);  
    List<UAlarm> alarms = db.getAllAlarms();        
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
    for (UAlarm ua : alarms) {  
        String programme = ua.getTitle();  
        String startTime = ua.getStart();  
        String endTime = ua.getEnd();  
        String nowPlaying = ua.getChannel();  
        db.addAlarm(new UAlarm(programme, startTime, endTime, nowPlaying, ""));  
        final UAlarm ut = new UAlarm();  
        ut.setTitle(programme);  
        ut.setStart(startTime);  
        ut.setEnd(endTime);  
        ut.setChannel(nowPlaying);  
        ut.setId(db.getLastEntered());  
        String [] bla = startTime.split(":");  
        int hour = Integer.parseInt(bla[0].trim());  
        int minute = Integer.parseInt(bla[1].trim());  
        minute -= 2;  
        Calendar cal = Calendar.getInstance();  
        cal.set(Calendar.HOUR_OF_DAY, hour);  
        cal.set(Calendar.MINUTE, minute);  
        Intent intenta = new Intent(this, NotificationMenu.class);  
        String name = programme;  
        intenta.putExtra("name", name);  
        intenta.putExtra("id", db.getLastEntered());  
          PendingIntent pendingIntent = PendingIntent.getBroadcast(this, ua.getId(),  
            intenta, PendingIntent.FLAG_CANCEL_CURRENT);  
          am.set(AlarmManager.RTC_WAKEUP,  
            cal.getTimeInMillis(), pendingIntent);      
    }  
}  

通过使用AlarmManager,NotificationMenu将成为通知的原因。

1个回答

49

我不确定我是否理解了启动接收器以及如何重新启动所有的闹铃。

只需调用你的代码,在 AlarmManager 上调用 setRepeating() 或其他方法即可。

例如,在这个示例项目中PollReceiver 被设置为接收 BOOT_COMPLETED。在 onReceive() 中,它会重新安排闹铃:

package com.commonsware.android.schedsvc;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;

public class PollReceiver extends BroadcastReceiver {
  private static final int PERIOD=5000;

  @Override
  public void onReceive(Context ctxt, Intent i) {
    scheduleAlarms(ctxt);
  }

  static void scheduleAlarms(Context ctxt) {
    AlarmManager mgr=
        (AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
    Intent i=new Intent(ctxt, ScheduledService.class);
    PendingIntent pi=PendingIntent.getService(ctxt, 0, i, 0);

    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME,
                     SystemClock.elapsedRealtime() + PERIOD, PERIOD, pi);
  }
}

1
谢谢分享,但是我为什么在你的代码@CommonsWare中看不到BOOT_COMPLETED呢? - ericn
7
您显然没有点击答案中的超链接来查看整个项目,包括其清单。 - CommonsWare
@CommonsWare 是AlarmManager获取间隔更新的最佳方式,还有一些其他实现方式,例如TimerTask等。我们应该使用哪种? - Ahmad Raza
对我来说,当我们打开设备时,它会额外发送一次。 - Karthick M
在我的观点中,实现自己的外部链接可以使答案更加可靠。请注意,这里的“+1”是指赞同或支持的意思。 - grepsedawk
显示剩余24条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接