2016-03-27 4 views
0

У меня есть диспетчер аварийной сигнализации. Он должен работать один раз в день. И будильник должен существовать, если я удаляю приложение из задачи или перезагружаю устройство. Но когда я перезагружаю устройство, тревоги не существует. Если я удалю приложение из задачи, будильник тоже не существует.AlarmManager не работает

MainActivity:

@Override 
    protected void onResume() { 
      if (isAlarmEnableded) { 
      if (!isAlarmSheduled) { 
       setAlarm(); 
       isAlarmSheduled = true; 
       putInSharedPreferences(Boolean.toString(isAlarmSheduled)); 
      } 
     } else { 
      cancelAlarm(MainActivity.this); 
      isAlarmSheduled = false; 
      putInSharedPreferences(isAlarmSheduled); 
     } 

     super.onResume(); 
    } 

isAlarmEnableded - SwitchPreference = верно. Если isAlarmEnableded - я выключаю будильник. isAlarmSheduled - значение, которое я сохраняю в настройках. Он отображает состояние аварийного сигнала

private void setAlarm() { 

     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmReceiver.class); 
     intent.setAction(Constants.ALARM_INTENT); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
       Constants.PENDINGINTENT_REQUEST_CODE, intent, 0); 

     if (android.os.Build.VERSION.SDK_INT >= 19) { 
      alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(), 
        AlarmManager.INTERVAL_DAY, pendingIntent); 
     } else { 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setAlarmTime(), 
        AlarmManager.INTERVAL_DAY, pendingIntent); 
     } 

private long setAlarmTime() { 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

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

     if (System.currentTimeMillis() > calendar.getTimeInMillis()) { 
      calendar.add(Calendar.DAY_OF_YEAR, 1); 
     } 
     return calendar.getTimeInMillis(); 
    } 

Если текущее время> это время, я установил будильник на завтра.

Constants.ALARM_INTENT - "com.blabla.AlarmReceiver".

AlarmReceiver

@Override 
    public void onReceive(Context context, Intent intent) { 
     intent.setClass(context, NotificationActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 

NotificationActivity показывает диалог во время тревоги. Также у меня есть DeviceBootReceiver, который вызывает метод setAlarm() и ставит isAlarmScheduled в настройках. Manifest

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name="com.mypackage..AlarmReceiver"> 
      <intent-filter> 
       <action android:name="com.blabla.AlarmReceiver" /> 
      </intent-filter> 
     </receiver> 

     <receiver 
      android:name="com.mypackage.DeviceBootReceiver"> 

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

Я проверяю сигналы тревоги по adb shell dumpsys alarm > dump.txt. Мне нужен стабильный сигнал тревоги, который работает один раз в день во всех случаях. Если я выключил приложение и перезапустил его, то будильник должен быть таким же. Тревога срабатывает во всех случаях, но не при перезагрузке устройства и при удалении приложения из задачи. Maby мой код содержит некоторые ошибки. Помогите мне решить мою проблему, потому что я не знаю, что я делаю неправильно/Спасибо

ответ

0

Вы должны обрабатывать загрузочный приемник для инициализации тревоги после загрузки устройства, что-то вроде:

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     List<Note> notes = dbHelper.getAllNotesAlarms(); 
    for (Note note : notes) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(note.getAlarm()); 
     Intent intent = new Intent(App.getAppContext(), AlarmService.class); 
     intent.putExtra("NOTE_ID", note.getId()); 
     PendingIntent pendingIntent = PendingIntent.getService(App.getAppContext(), 
       (int) note.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager am = 
       (AlarmManager) App.getAppContext().getSystemService(Activity.ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
       pendingIntent); 
    } 
    } 

} 
+0

Я знаю. Мой приемник выглядит так, как вы его описываете. Он вызывает метод setAlarm() и ставит isAlarmScheduled в настройках. Но это не работает – Jackky777

+0

Что касается класса com.mypackage.DeviceBootReceiver, можете ли вы отправить файл класса –

+0

protected void onResume() {setAlarm(); isAlarmSheduled = true; putInSharedPreferences (Boolean.toString (isAlarmSheduled));} – Jackky777