2015-06-24 6 views
17

Я запускаю AlarmManager с PendingIntent и на нескольких телефонах. Тревога не отвечает. На некоторых устройствах работает нормально на других, это терпит неудачу. Я провел несколько тестов на разных телефонах.Android AlarmManager останавливается, когда активность умирает

Nexus работает нормально, также Samsung Galaxy S4 zoom (4.2) работает нормально.

Samsung примечание 2 (4.3) работает нормально.

OPPO (4.4.4) аварийный сигнал.

Я также внедрил широковещательные приемники, которые работают как на всех устройствах.

Log.v(TAG, "START ALARM"); 

    Intent intentAlarm = new Intent(context, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent); 
+0

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

+1

Да, его истинное, ожидающее намерения не называется. Я могу предоставить журналы, но позже (у меня нет телефона). – 5er

+0

Для версий выше API 19: я запускаю Alarm с 'setExact', а затем, когда выполняется, я снова запускаю будильник с помощью' setExact' ... Кажется, что он работает ... Попробует и опубликует решение. – 5er

ответ

7

Проверьте, находится ли приложение в состоянии остановки. Когда приложение находится в состоянии остановки, он не получит никаких сигналов тревоги или событий.

Кроме того, я предполагаю, что это может быть OEM/производитель конкретные прошивки/OS issue.To проверить, является ли сигнал тревоги быть на самом деле график использования ADB dumpsys оболочки тревоги и проверить, является ли ваша тревога приложение быть на самом деле планируется.

Чтобы проверить, является ли он в остановленном состоянии с помощью следующей команды:

ADB оболочки dumpsys пакет "com.package.name" и проверить "остановились = истина"

Чтобы узнать больше о остановленном состоянии относятся:

Launch controls on stopped applications 

Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications. 

Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately. 

The platform defines two new intent flags that let a sender specify whether the Intent should be allowed to activate components in stopped application. 

FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential targets to resolve against. 
FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential targets. 
When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential targets. 

Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications. 

Applications are in a stopped state when they are first installed but are not yet launched and when they are manually stopped by the user (in Manage Applications). 

Внимание: Состояние останавливается, отличается от того, что приложение не работает.

+1

Это действительно так? Разве предложение тревог, что вы можете остановить приложение, также перезапустить устройство, и будильник будет живым, если его установить правильно? Он работает для меня таким образом, для всех тестируемых телефонов (исключение для 4.4.4). – 5er

+0

да, я чувствую запах дерьма ... тревога не привязана к текущим действиям xour деятельности –

+0

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

2

Это только предположение, но я думаю, что проблема связана с API. Начиная с KitKat, система запускает AlarmManager. Возможно, попробуйте использовать что-то другое для систем на abd выше kitkat.

примечание: Начиная с доставки сертификата API 19 (KITKAT) неточно: ОС сбрасывает аварийные сигналы, чтобы свести к минимуму пробуждения и использование батареи. Появились новые API-интерфейсы для поддержки приложений, требующих строгих гарантий доставки, см. SetWindow (int , long, long, PendingIntent) и setExact (int, long, PendingIntent). Приложения, чья targetSdkVersion ранее, чем API 19, будут продолжать видеть предыдущее поведение, при котором все аварийные сигналы доставляются именно по запросу. "

Взято из http://developer.android.com/reference/android/app/AlarmManager.html

+0

Хорошая точка, это может быть что-то на этом. Это проверит. – 5er

+0

дает вам 50b, так как ваш ответ отведите меня ближе всего к возможному разрешению – 5er

+0

Большое спасибо! Мне жаль, что я не мог больше помочь. – Andy

4

Здесь может быть несколько различных проблем:

  • Тип сигнала тревоги, который вы запрашиваете (ELAPSED_REALTIME), не пробудит устройство для доставки будильника. Вместо этого, если он истекает во время сна, устройство будет доставлено при следующем пробуждении устройства.
  • Значение triggerAtMillis1000 запрашивает первый сигнал тревоги через 1 секунду после загрузки устройства. Если устройство уже запущено и вы запрашиваете этот сигнал, первый аварийный сигнал может не срабатывать и может привести к тому, что последующие сообщения не будут назначены. Это просто догадка, я не проверял, посмотрев на источники 4.4.4 AOSP.

Обработка сигналов тревоги была изменена в API 19 (Android 4.4) для обработки сопоставления таймеров сигнализации (все по умолчанию неточно), и это изменение могло повлиять на вещи для второй пули. Вы можете попробовать изменить значение triggerAtMillis быть (SystemClock.elapsedRealtime() + 1000)

Обратите внимание, что если вам нужно устройство из спящего режима, вам нужно использовать вариант с _WAKEUP сигнализации, а также иметь ваш BroadcastReceiver взять замок бодрствование, который ваш Service или Activity когда он будет обрабатывать сигнал тревоги.

+0

Я пробовал, он не решает проблему. – 5er

+0

Вам нужно будет уточнить, что вы видите или не видите. Прямо сейчас вы только сказали «это не работает». Является ли «BroadcastReceiver» вы создали «PendingIntent» для запуска запуска? Что такое устройство, выполняемое в тот момент, когда будильник (должен) истекает? Что вы видите в журналах? –

+0

Я попробую ваше предложение ((SystemClock.elapsedRealtime() и _WAKEUP), а в (4.4.4) не активируется аварийный сигнал. Но верно, что в API 19 изменен сигнал тревоги. Теперь я проверю эти изменения. – 5er

0

Попробуйте следующее:

1) Добавить разрешение WAKE_LOCK дэ в манифесте.

<uses-permission android:name="android.permission.WAKE_LOCK"> 

2) Изменение

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent); 

с

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000, 5000, pendingIntent); 
+0

это не поможет. – 5er

0

Не могли бы вы показать нам код AlarmReceiver.class? Возможно, вам нужно использовать return START_STICKY; по методу onStartCommand?

0

Попробуйте разместить AlarmManager в фоновом режиме.

0

Ваши тревоги будут продолжать существовать после того, как ваше приложение будет нормально закрыто. Если это принудительно остановлено или ваше устройство перезагружено или обновление для вашего приложения установлено, или ваше приложение будет удалено, они будут потеряны. Вы можете создать BroadcastReceivers для некоторых из этих ситуаций, чтобы воссоздать ваши тревоги.

Кроме того, setInexactRepeating - это именно то, что: неточно. Когда эта тревога срабатывает, зависит от реализации и не может быть точно предсказана.

+0

Ваш комментарий не соответствует действительности. Если вы установите Сигнализации и BroadcastReceivers будут жить – 5er

+0

Нет, это означает вы получаете намерение при загрузке системы. Вы все еще должны поймать это намерение с помощью BroadcastReceiver, а затем воссоздать свои сигналы тревоги. – TBridges42

+0

Ой, вы правы. Это правда. Мои извинения. Я делаю это ... однако это не так. – 5er

0
Try this it works when activity is not running.. 

     Calendar calendar = Calendar.getInstance(); 

     long timemills = calendar.getTimeInMillis(); 
     Intent myIntent = new Intent(this, TimeChangeReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

      alarmManager.set(AlarmManager.RTC, timemills, pendingIntent); 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timemills, 
        10000, pendingIntent); 
+0

Еще одна проблема с диспетчером аварийных сообщений не работает с андроидом KitKat. Его рабочий тон в Jelly beans. Есть некоторые изменения в Kitkat –

+0

Да. setExact (...) является единственным – 5er

0

Я также использовал Alarm Service в своем проекте для подготовки к работе в течение 6 или 7 минут. И он работает нормально во всех телефонах.

я есть сделать службу сигнализации, как это:

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.SystemClock; 
import android.util.Log; 

public class MyAlarmService { 
    private static PendingIntent resetAlarm; 
    private static String TAG="CellPoliceChildGPSAlarmService"; 
    private static AlarmManager am; 
    public static void start(Context context) { 
     try { 
      // We want the alarm to go off 30 seconds from now. 
      long firstTime = SystemClock.elapsedRealtime(); 

      // Create an IntentSender that will launch our service, to  be scheduled with the alarm manager. 
      //resetAlarm = PendingIntent.getService(context, 0, new  Intent(context, Get_NonRootDetails.class), 0); 
      resetAlarm = PendingIntent.getService(context, 0, new  Intent(context, CallNonRBackgroundService.class), 0); 
      // Schedule the alarm! 
      am = (AlarmManager)  context.getSystemService(Context.ALARM_SERVICE); 
      Log.i(TAG, firstTime+""); 
      am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  firstTime, 10*1000*60, resetAlarm); 
     } 
     catch (Exception e) { 
      Log.v("CellInfo", "Exception while start the  MyAlarmService at: " + e.getMessage()); 
     } 
    } 

    public static void stop(Context context) { 
     try { 
      // When interval going to change from web services 
      am.cancel(resetAlarm); 
     } 
     catch (Exception e) { 
      Log.v("CellInfo", "Exception while start the  MyAlarmService at: " + e.getMessage()); 
     } 
    } 


} 

я назвал или начать, как это;

MyAlarmService.start(SplashActivity.this); 

Учитывая разрешение в манифесте:

<uses-permission android:name="android.permission.WAKE_LOCK"> 

    <service 
      android:name="com.secure.DataCountService" 
      android:enabled="true" > 
      <intent-filter> 
       <action  android:name="com.secure.MyService" /> 
      </intent-filter> 
     </service> 

Для уведомлений я также используются в ожидании намерения, как;

Intent notificationIntent = new Intent(context, DashBoardActivity.class); 

     PendingIntent pendingIntent = PendingIntent.getActivity(context,  0, notificationIntent, 0); 

     notification.setLatestEventInfo(context, contentTitle,  PushNotificationUtils.notiMsg, pendingIntent); 
     notification.flags |= notification.FLAG_AUTO_CANCEL; 
Смежные вопросы