【问题标题】:Android AlarmManager after reboot重启后的Android AlarmManager
【发布时间】:2012-09-12 19:47:45
【问题描述】:

我有一组在重启后需要保留的警报。我试过在引导接收器上使用,但它们不会再次启动。我不确定我是否了解启动接收器以及如何重新启动所有警报。我已经有一个接收器来接收我的通知,但不知道我是否可以使用同一个接收器或者是否需要一个新接收器?

谁能指点我任何好的教程或帮助我?

干杯

代码:

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

NotificationMenu 是通知,这就是我使用 AlarmManager 的原因

【问题讨论】:

    标签: android restart reboot alarms


    【解决方案1】:

    我不确定我是否了解启动接收器以及如何重新启动所有警报。

    只需调用您的代码即可在AlarmManager 上调用setRepeating()(或其他)。

    例如,在this sample project 中,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);
      }
    }
    

    【讨论】:

    • 感谢分享,但为什么我在您的代码@CommonsWare 中没有看到BOOT_COMPLETED
    • @fuzzybee:你显然没有点击答案中的超链接来检查整个项目,包括它的清单。
    • @CommonsWare 是 AlarmManager 获取间隔更新的最佳方式,几乎没有其他方法可以实现它,例如 TimerTask 等。我们应该使用哪个???
    • 对我来说它又发送了一次,同时我们也打开了我们的设备
    • +1 用于实现您的 OWN 外部链接。在我看来,这是一个更可靠的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多