I am trying to create an alarm based application. I am using AlarmManager . The fact is that it is not reliable at all. It works on some devices .. on other devices, it works something ... and on other devices it does not work at all.
When I say that this does not work, it is simple, the alarms do not work. For example, in my Xiaomi Mi4, if you turn off the screen, no alarm will be triggered. I have a Moto G test in that the phone signals work fine, but in OnePlus the alarms do not work. They are simply not called.
Am I missing something? Does anyone know what I'm doing wrong?
Many thanks for your help!
This is my Alarm class:
public abstract class Alarma extends BroadcastReceiver { protected AlarmManager am; protected PendingIntent alarmIntent; public void cancelAlarm(Context context) {
This is my OneTimeAlarm, an alarm that fires only once, and then it does not fire again.
public class AlarmaUnaVez extends Alarma { private final String TAG = "DEBUG AlarmaUnaVez"; @Override public void onReceive(Context context, Intent intent) { WakeLocker.acquire(context); Logger.debugLog(TAG, "Alarm intent received"); Logger.debugLog(TAG, "AlarmaUnaVez !!!!!!!!!!"); Logger.debugLog(TAG, "Lanzando servicio"); Funciones.cambiarEstado(context, Constants.Estados.ESPERANDO); Intent i = new Intent(context, SearchObjetivoService.class); context.startService(i); cancelAlarm(context);
This is my daily alarm that only sounds once a day.
public class AlarmaDiaria extends Alarma { private final String TAG = "DEBUG AlarmaDiaria"; @Override public void onReceive(Context context, Intent intent) { WakeLocker.acquire(context); Logger.debugLog(TAG, "Alarm intent received"); Logger.debugLog(TAG, "AlarmaDiaria !!!!!!!!!!"); Logger.debugLog(TAG, "Lanzando servicio"); Funciones.setPinchado(context, false); Funciones.cambiarEstado(context, Constants.Estados.ESPERANDO); Intent i = new Intent(context, SearchObjetivoService.class); context.startService(i); WakeLocker.release();
This is my repeated alarm that sounds every hour.
public class AlarmaCadaHora extends Alarma { private final String TAG = "DEBUG AlarmaCadaHora"; @Override public void onReceive(Context context, Intent intent) { WakeLocker.acquire(context); Logger.debugLog(TAG, "Alarm intent received"); Logger.debugLog(TAG, "AlarmaCadaHora !!!!!!!!!!"); Logger.debugLog(TAG, "Lanzando servicio");
My WakeLocker class (I found it here on stackoverflow).
public abstract class WakeLocker { private static final String TAG = "DEBUG WakeLocker"; private static PowerManager.WakeLock wakeLock; public static void acquire(Context ctx) { if (wakeLock != null) wakeLock.release(); PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG); wakeLock.acquire(); } public static void release() { if (wakeLock != null) wakeLock.release(); wakeLock = null; } }
And finally, my manifest.
<uses-permission android:name="android.permission.WAKE_LOCK" /> . . . <receiver android:name=".receivers.BootReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <receiver android:name=".receivers.alarmas.AlarmaDiaria" android:enabled="true" android:process=":remote" android:exported="false"> <intent-filter> <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_DIARIA" /> </intent-filter> </receiver> <receiver android:name=".receivers.alarmas.AlarmaUnaVez" android:enabled="true" android:process=":remote" android:exported="false"> <intent-filter> <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_UNA_VEZ" /> </intent-filter> </receiver> <receiver android:name=".receivers.alarmas.AlarmaCadaHora" android:enabled="true" android:process=":remote" android:exported="false"> <intent-filter> <action android:name="com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA" /> </intent-filter> </receiver>
And this is how I set alarms, for example, inside an action.
AlarmaDiaria alarma = new AlarmaDiaria(); alarma.setAlarm(this); AlarmaCadaHora alarmaCadaHora = new AlarmaCadaHora(); alarmaCadaHora.setAlarm(this);