2016-01-07 2 views
0

У меня проблема с AlarmManager. При перезагрузке устройства, он автоматически срабатывает сигнал тревоги, даже если указанное время является некорректным (например, устройство перезагружается полностью в 3:00 вечера, указанное время 4:00 часов утра)Android Alarm Manager не срабатывает в определенное время при перезагрузке

Вот что я пытался до сих пор:

class DeviceBootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    // Check if successful reboot 
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 

     SharedPreferences shared = context.getSharedPreferences(Constants.PREF_NAME, Context.MODE_PRIVATE); 
     // Check if daily notification is enabled 
     // If yes, call NotificationPublisher to communicate with NotificationAlarmService 
     if(shared.getBoolean(Constants.KEY_IS_DAILY_NOTIFIED, false)) { 
      DBHelper dbHelper = new DBHelper(context); 
      DBConnector.dbConnect(dbHelper); 

      int DAILY_NOTIFICATION_ID = Constants.DAILY_VERSE_NOTIFICATION_1_ID; 
      ArrayList<Notification> notificationList = dbHelper.getNotifications(); 
      Log.e("", "notificationList: " + notificationList.size()); 

      for(Notification obj : notificationList) { 
       Calendar datetime = Calendar.getInstance(); 
       datetime.set(Calendar.HOUR_OF_DAY, obj.getHourOfDay()); 
       datetime.set(Calendar.MINUTE, obj.getMinute()); 
       datetime.set(Calendar.SECOND, 0); 

       Calendar now = Calendar.getInstance(); 
       if (now.after(datetime)) { 
        datetime.add(Calendar.DATE, 1); 
       } 

       Log.e("BOOT RECEIVER", "" + obj.getHourOfDay() + ":" + obj.getMinute()); 

       Intent myIntent = new Intent(context, NotificationPublisher.class); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
         DAILY_NOTIFICATION_ID++, 
         myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
       AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
         datetime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, 
         pendingIntent); 
      } 

     } 

    } 
} 

AndroidManifest:

<receiver 
     android:name=".utils.DeviceBootReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
     </intent-filter> 
    </receiver> 

То, что кажется неправильным с моим кодом? Буду признателен за любую помощь. Благодаря!

+0

Запуск службы сигнализации о перезагрузке устройства, взгляните на ссылке http://javatechig.com/android/repeat-alarm-example-in-android – Mahalakshmi

+0

@bEtTy Barnes: Ваш код выглядит хорошо Попробуйте переустановить приложение и посмотрите, работает ли оно. – kevz

+0

@kevz Я сделал это, но безрезультатно. –

ответ

0

Docs говорят:

Если заявленное время срабатывания в прошлом, сигнализация срабатывает немедленно.

Таким образом, вы должны проверить, настроено ли вы в прошлом или нет в вашей логике приложения.

Например, в вашем приемнике BOOT_COMPLETED, где вы устанавливаете будильник, вы можете проверить, действительно ли это время или нет. Другой вариант заключается в том, что ваш целевой компонент запускается, вы можете проверить это.

+0

Спасибо! Можете ли вы предоставить несколько примеров кода для начала? –

+0

Кроме того, это происходит, когда время запуска больше, чем текущее время. –

+0

@bEtTyBarnes Логика проста! Проверьте, находится ли текущее время, указанное в настоящее время, _before_, если это так, не планируйте диспетчер аварийных сообщений для этих видов времени. –

0

Если вы установили будильник в прошлый раз, он будет немедленно срабатывать. Перед настройкой будильника вы должны проверить его вручную.

public class BootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
      // Set alarms 
      Calendar calendar = Calendar.getInstance(); 


      calendar.set(Calendar.HOUR_OF_DAY, 18); 
      calendar.set(Calendar.MINUTE, 0); 
      calendar.set(Calendar.SECOND, 0); 

      Intent intent1 = new Intent(context, AlarmReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getService(
        context, 0, intent1, 
        PendingIntent.FLAG_UPDATE_CURRENT); 
      AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

      long triggerMillis = calendar.getTimeInMillis(); 

      if (calendar.getTimeInMillis() < Calendar.getInstance() 
        .getTimeInMillis()) { 
       triggerMillis = calendar.getTimeInMillis() + INTERVAL_DAY; 

       System.out.println("Alarm will go off next day"); 
      } 
     #Set alarm here using "triggerMillis" 
     ......................... 
     ........................... 
} 
Смежные вопросы