Fuerza la aplicación de parada – también cancela las alarmas que había establecido?
Mi aplicación está configurando una alarma:
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); mgr.setRepeating( AlarmManager.RTC_WAKEUP, firstRun, interval, makePendingIntent(context));
Funciona bien. Si entro en la configuración del sistema -> aplicaciones, y la fuerza de detener mi aplicación, parece que esto también tiene el efecto de cancelar las alarmas que había programado. ¿Es esto cierto? Si es así, estoy en una situación extraña en la que mis últimos ajustes conocidos son que el usuario de hecho había puesto la alarma, pero el sistema puede haber cancelado a mis espaldas, por lo que ahora estoy mostrando al usuario el estado equivocado en cuanto a Si la alarma está ajustada o no.
Gracias
Sí, es verdad. Todo lo que puedes hacer, hasta donde yo sé, es hacer que tu estado sea correcto. Para comprobar si sus alarmas están todavía allí usted tiene que tomar dos pasos:
- Atempt para crear su
PendingIntent
conFLAG_NO_CREATE
– la funcióncheckPendingIntent
será exactamente comomakePendingIntent
excepto para este flag enPendingIntent.getBroadcast
y un cheque del resultado – si la alarma ha sido cancelada de una manera ordinaria (por sí mismo, por supuesto si usted llamóPendingIntent
cancel()
para suPendingIntent
s) o si su aplicación se bloqueó sin Force Stop (es decir, con una excepción noPendingIntent.getBroadcast
),PendingIntent.getBroadcast
devolverá null. -
Si el PendingIntent existe, su alarma puede estar configurada. Para comprobarlo tienes que descargar la información del sistema sobre todas las alarmas y buscar la tuya allí. Para volcar la información que tiene que llamar
String collectAlarmsInfo() { StringBuilder result = new StringBuilder(); try { Process process = Runtime.getRuntime().exec("dumpsys alarm"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = bufferedReader.readLine()) != null) { result.append(line); result.append("\n"); } } catch (IOException e) { Log.e(TAG, "Could not retrieve data", e); } return result.toString(); }
Para usar dumpsys necesitas tener permiso de usuario DUMP. Cuando tiene el volcado puede identificar alarmas en él por su nombre de paquete, por lo que el cheque será
boolean alarmIsSet = collectAlarmsInfo().contains(<your package name>);