Диспетчер сигналов тревоги для фоновых служб

Я внедрил диспетчер аварийных сигналов, чтобы периодически пробуждать фоновые службы каждые 15 минут. Он работает нормально, но с момента включения режима DOZE Android 6.0 он ведет себя странно и не просыпается каждые 15 минут. Хотя я использую метод alarm.setExactAndAllowWhileIdle(), но все еще не работаю в состоянии ожидания.

вот мой метод реализации Alarm Manager

 private void serviceRunningBackground()
{
    final Intent restartIntent = new Intent(this, service.class);
    restartIntent.putExtra("ALARM_RESTART_SERVICE_DIED", true);
    alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
   Handler restartServiceHandler;
    restartServiceHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             pintent = PendingIntent.getService(getApplicationContext(), 0, restartIntent, 0);
             if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
                 Log.d(TAG, " Marshmellow "+ TIMER_START_TIME);
                 alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 900000, pintent);                  
             } else {
                 alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 900000, pintent);
             }
             sendEmptyMessageDelayed(0, TIMER_START_TIME);
         }
     };
    restartServiceHandler.sendEmptyMessageDelayed(0, 0);
}

Любая помощь будет оценена .. спасибо


person user3290805    schedule 30.10.2015    source источник
comment
Вы тестируете на какой версии на данный момент?   -  person Mehul Joisar    schedule 30.10.2015
comment
Предварительная версия Android 6.0 на Nexus 5,   -  person user3290805    schedule 30.10.2015
comment
Используйте System.currentTimeMillis()+900000, и он сработает через 15 минут. Вам нужно будет снова написать такой код внутри вашего исходного метода service.java, чтобы он установил будильник на следующие 15 минут.   -  person Mehul Joisar    schedule 30.10.2015
comment
Я проверю, просто вопрос, это странно, поскольку они не предоставили такой метод, как setRepeating()... поправьте меня, если я ошибаюсь   -  person user3290805    schedule 30.10.2015
comment
Они пытаются увеличить срок службы батареи, и даже setRepeating больше не срабатывает будильник в точное время, начиная с API 19 или выше. раздел примечаний к оформлению заказа в этом http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int, long, long, android.app.PendingIntent)   -  person Mehul Joisar    schedule 30.10.2015


Ответы (1)


Попробуй это:

public class PollReceiver extends WakefulBroadcastReceiver{
    static final String PERIOD = "period";
    @Override
    public void onReceive(Context context, Intent intent){
         startWakefulService(context,new Intent(context,MyService.class));
         long period = intent.getLongExtra(PERIOD,-1);
         if(period>0){
         scheduleExactAlarm(context,(AlarmManager)context.getSystemService(Context.ALARM_SERVICE),period)
         }
    }


    static void scheduleExactAlarm(Context context,AlarmManager alarms, long period){
    Intent i = new Intent(context,PollReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context,0,i,0);
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1){
        alarms.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + period,pi);
    }
}

Я протестировал будильник таким образом в Doze, и он работает. Они ходят каждые 15 минут. Посетите https://commonsware.com, где я нашел этот метод планирования повторяющегося будильника.

person A.Sanchez.SD    schedule 30.10.2015