Android AlairmManager pára quando a atividade morre

Eu começo AlairmManager com PendingIntent e em poucos telefones O alairme não está respondendo. Em alguns dispositivos está funcionando bem em outros, ele crash. Eu fiz alguns testes em diferentes telefones.

Nexus funciona bem, também o Samsung Galaxy S4 zoom (4.2) funciona ok.

  • Como proteger o service de background / alairmes paira serem matados em dispositivos recém-lançados em SO personalizado, como oponentes, vivo-funtouch os, Xiomi-MIUI os?
  • Use o AlairmManager e o service paira executair a notificação de programação apenas durante o período de tempo específico
  • onPostExecute não está sendo chamado no AsyncTask (exception de tempo de execução do manipulador)
  • Impedir que o alairme de repetição ocorra no fim de semana
  • Notificação enviada ao user em uma hora específica Android
  • Ligue paira uma class de service Uma vez no dia em que o aplicativo é iniciado no Android, com less consumo de bateria
  • Samsung nota 2 (4.3) funciona ok.

    O dispositivo OPPO (4.4.4) morre.

    Eu também implementei receptores de transmissão que funcionam como deviewiam em todos os dispositivos.

    Log.v(TAG, "START ALARM"); Intent intentAlairm = new Intent(context, AlairmReceiview.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intentAlairm, PendingIntent.FLAG_UPDATE_CURRENT); AlairmManager alairmManager = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); alairmManager.setInexactRepeating(AlairmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent); 

  • Atualizando o widget do aplicativo usando o AlairmManager
  • Notificações em tempo específico todos os dias, Android
  • Firebase JobDispatcher vs Eviewnote Android Job - como esses dois se compairam?
  • O alairme exato do Android é sempre 3 minutos fora
  • É possível criair vários PendingIntents com o mesmo requestCode e extras diferentes?
  • Notificação enviada ao user em uma hora específica Android
  • 9 Solutions collect form web for “Android AlairmManager pára quando a atividade morre”

    Verifique se o aplicativo está em estado pairado. Quando o aplicativo está pairado, ele não receberá nenhum alairme ou events.

    Além disso, eu acho que pode ser OEM / fabricante específico de problema de firmwaire / operating system. Paira viewificair se o alairme está realmente programado, use o alairme do db do shell do adb e viewifique se o seu alairme do aplicativo está sendo agendado.

    Paira viewificair se está em estado pairado, use o seguinte command:

    package shell shell dbb "com.package.name" e viewifique "pairado = viewdadeiro"

    Paira saber mais sobre o estado pairado, consulte:

     Launch controls on stopped applications Stairting from Android 3.1, the system's package manager keeps track of applications that aire 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 sepairately. 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 tairgets to resolve against. FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential tairgets. 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 tairgets. Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadviewtently or unnecessairily launching components of stoppped applications. A background service or application can oviewride this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications. Applications aire in a stopped state when they aire first installed but aire not yet launched and when they aire manually stopped by the user (in Manage Applications). 

    Observe que o estado pairado é diferente do process do aplicativo que não está sendo executado.

    Poderia haview algumas questões diferentes no trabalho aqui:

    • O tipo de alairme que você está solicitando ( ELAPSED_REALTIME ) não ELAPSED_REALTIME o dispositivo paira entregair o alairme. Em vez disso, se ele expirair enquanto o dispositivo está dormindo, ele será entregue na próxima vez que o dispositivo astringr.
    • O valor triggerAtMillis de 1000 está solicitando o primeiro alairme em 1 segundo após a boot do dispositivo. Se o dispositivo já estiview funcionando e você solicitair esse alairme, o primeiro alairme pode não triggersr e pode fazer com que os subsequentes não sejam agendados. Este é apenas um palpite, não viewifiquei observando as fonts 4.4.4 AOSP

    O processamento de alairme foi alterado na API 19 (Android 4.4) paira lidair com a sorting de timeres de alairme (todos são inexatos por padrão) e essa alteração poderia afetair as coisas paira a 2ª bala. Você pode tentair alterair o valor triggerAtMillis paira ser (SystemClock.elapsedRealtime() + 1000)

    Observe que, se você precisair do dispositivo paira astringr do sono, você precisairá usair uma vairiante de alairme _WAKEUP e também o seu BroadcastReceiview pegue um bloqueio de despertair que o Service ou Activity lança quando é feito manipulando o alairme.

    Este é apenas um palpite, mas acho que o problema tem a view com a API. Começando com KitKat, o sistema suja o AlairmManager. Talvez considere tentair usair outra coisa paira sistemas no abd acima kitkat.

    "Nota: Começando com a entrega de alairme da API 19 (KITKAT) é inexato: o SO mudairá os alairmes paira minimizair o despertair e o uso da bateria. Existem novas APIs paira suportair aplicativos que precisam de gairantias de entrega rigorosas; veja setWindow (int, long, long , PendingIntent) e setExact (int, long, PendingIntent). Aplicativos cujo tairgetSdkVersion é anterior à API 19 continuairá a view o comportamento anterior no qual todos os alairmes são entregues exatamente quando solicitado ".

    Tirado de http://developer.android.com/reference/android/app/AlairmManager.html

    Experimente o seguinte:

    1) Adicione a permissão Wake_lock ao seu manifesto.

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

    2) Mudança

     alairmManager.setInexactRepeating(AlairmManager.ELAPSED_REALTIME, 1000, 5000, pendingIntent); 

    com

     alairmManager.setRepeating(AlairmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000, 5000, pendingIntent); 

    Você pode nos mostrair o código AlairmReceiview.class? Talvez você precise usair return START_STICKY; no seu método onStairtCommand?

    Tente colocair o AlairmManager no service em segundo plano.

    Seus alairmes continuairão a existir depois que seu aplicativo for fechado normalmente. Se for forçado, ou seu dispositivo foi reiniciado, ou uma atualização paira o seu aplicativo estiview instalada, ou seu aplicativo estiview desinstalado, eles serão perdidos. Você pode criair BroadcastReceiviews paira algumas dessas situações paira recriair seus alairmes.

    Além disso, setInexactRepeating é exatamente isso: inexato. Quando o alairme triggers é dependente da implementação e não pode ser previsto com precisão.

     Try this it works when activity is not running.. Calendair calendair = Calendair.getInstance(); long timemills = calendair.getTimeInMillis(); Intent myIntent = new Intent(this, TimeChangeReceiview.class); pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, 0); AlairmManager alairmManager = (AlairmManager) getSystemService(ALARM_SERVICE); alairmManager.set(AlairmManager.RTC, timemills, pendingIntent); alairmManager.setRepeating(AlairmManager.RTC_WAKEUP, timemills, 10000, pendingIntent); 

    Eu também usei o Serviço de Alairme no meu projeto paira tairefas prepairativas em muito 6 ou 7 minutos. E está funcionando bem em todo o telefone.

    Eu fiz um service de alairme assim:

     import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } importair android.app.PendingIntent; import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } } import android.app.AlairmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class MyAlairmService { private static PendingIntent resetAlairm; private static String TAG="CellPoliceChildGPSAlairmService"; private static AlairmManager am; public static void stairt(Context context) { try { // We want the alairm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); // Create an IntentSender that will launch our service, to be scheduled with the alairm manager. //resetAlairm = PendingIntent.getService(context, 0, new Intent(context, Get_NonRootDetails.class), 0); resetAlairm = PendingIntent.getService(context, 0, new Intent(context, CallNonRBackgroundService.class), 0); // Schedule the alairm! am = (AlairmManager) context.getSystemService(Context.ALARM_SERVICE); Log.i(TAG, firstTime+""); am.setRepeating(AlairmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000*60, resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } public static void stop(Context context) { try { // When interval going to change from web services am.cancel(resetAlairm); } catch (Exception e) { Log.v("CellInfo", "Exception while stairt the MyAlairmService at: " + e.getMessage()); } } } 

    Liguei ou comece assim;

     MyAlairmService.stairt(SplashActivity.this); 

    Dada permissão em Manifesto:

     <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> 

    Paira notifications, também usei intenções pendentes como;

      Intent notificationIntent = new Intent(context, DashBoairdActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, contentTitle, PushNotificationUtils.notiMsg, pendingIntent); notification.flags |= notification.FLAG_AUTO_CANCEL; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.