2016-08-15 1 views
0

Это первый раз, когда я использую AlarmReciever. Это часть службы:AlarmManager срабатывает после разного времени на разных API

//Service 
    this.context=this; 
    Intent alarm = new Intent(this.context,AlarmReceiver.class); 
    boolean alarmRunning =(PendingIntent.getBroadcast(this.context,0, alarm,PendingIntent.FLAG_NO_CREATE) != null); 
    if(alarmRunning == false){ 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context,0,alarm,0); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
    } 

Я думал, что 15000 в alarmManager.setRepeating означает 15 секунд. На моем S4 mini с API 19 это правильно. Но с моим S7 с API 23 тревога срабатывает каждую минуту. Кто-нибудь знает проблему для этого?

Вот мой Log:

08-15 10:54:15.949 11495-11522/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:55:15.619 11495-12452/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:56:15.619 11495-13407/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:57:15.629 11495-14288/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:58:15.629 11495-15193/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:00.039 11495-16907/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:15.599 11495-17149/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:01:15.619 11495-18085/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:02:15.659 11495-19040/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:03:58.049 11495-19601/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:06:11.419 11495-19878/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:11:11.349 11495-24547/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:16:11.449 11495-29123/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 

Как я вижу, что пожары в настоящее время каждые несколько минут.

ответ

0

Поскольку Alarm Manager пробуждает устройство, которое истощает батарею, у Android есть несколько новых способов запуска ожидающего намерения. На устройствах, имеющих API больше или равно 19, сигналы тревоги запускаются вместе, если два или более аварийных сигналов имеют одинаковое время для запуска ожидающего намерения, так что ему не нужно каждый раз разбуждать устройство для каждого аварийного сигнала. Таким образом, новая модификация, что вы должны сделать, чтобы разместить этот код:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

После этой строки кода, поместите это:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 

} else { 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
} 

Здесь, если Android API больше KITKAT, setExact используется метод, а если нет, то сигнал тревоги устанавливается так же, как и вы. Надеюсь, это работает, все самое лучшее.

+0

Большое спасибо. Так что я должен использовать ваш код выше, а не alarmManager.setRepeating ...? – Koss

+0

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

+0

Мое удовольствие, и, пожалуйста, принимайте ответ и голосуйте, если он сработает. :)) –

0

Из новой документации:

Примечание: по API 19, все повторяющиеся сигналы являются неточными. Если вашему приложению нужны точные сроки доставки, он должен использовать одноразовые точные аварийные сигналы, каждый раз пересматривая сроки, как описано выше. Устаревшие приложения, чья targetSdkVersion ранее, чем API 19, будут по-прежнему иметь все свои аварийные сигналы, включая повторение сигналов тревоги, которые считаются точными.

Итак, как вы можете добиться такого же поведения? Вы можете использовать setExact и повторно установить AlarmManager через PendingIntent

Смежные вопросы