proyecto - notificaciones android studio
Cómo crear un AlarmManager persistente (2)
Cada vez que se elimina nuestra aplicación, también se elimina el AlarmManager.
AlarmManager
no se mata. Su alarma, sin embargo, se cancela. Si el usuario realiza un paro forzado o lo mata, sus alarmas no están programadas. En Android 3.1+, si el usuario lo detiene, no se ejecutará nada de su código hasta que el usuario inicie manualmente una de sus actividades.
Después de hablar con varios de ellos, mi sospecha es que nuestra aplicación se está eliminando de forma manual a través de una aplicación que destruye las tareas o que Android en sí está matando nuestra aplicación.
Idealmente, su aplicación no debe escribirse de tal manera que Android tenga algún motivo para deshacerse de usted. Para algo como lo que usted describe, debe usar un getBroadcast()
PendingIntent
apunta a un BroadcastReceiver
registrado en el manifiesto, o debe usar un getService()
PendingIntent
apunta a un IntentService
. En cualquier caso, su código se ejecutará brevemente y, luego, su proceso será elegible para su recuperación por parte de Android sin problemas si es necesario.
Los asesinos de tareas, ya sean manuales o automáticos, parecen ser mucho más responsables de que se cancelen las alarmas, en mi humilde opinión.
Edición: aclaró la pregunta basándose en la respuesta de CommonsWare
Estamos programando una alarma a través de AlarmManager para que se active cada 60 segundos. Cuando nuestra aplicación muere, nuestras alarmas parecen no funcionar más. ¿Hay alguna manera de hacer que estas alarmas persistan incluso cuando la aplicación se elimina manualmente o por el sistema?
Este es un problema para nosotros porque tenemos una aplicación de widget que muestra el tiempo. Esto significa que necesitamos actualizar la hora cada minuto. Para superar el límite de actualización de 30 minutos en el método onUpdate de AppWidgetProvider, usamos AlarmManager. Por lo general, funciona bastante bien, pero algunos usuarios han informado que el tiempo se está desincronizando. Después de hablar con varios de ellos, mi sospecha es que nuestra aplicación se está eliminando de forma manual a través de una aplicación que destruye las tareas o que Android en sí está matando nuestra aplicación.
Cualquier otra solución alternativa al problema raíz (mantener el tiempo sincronizado en un widget) también será bienvenida.
Aquí está el código que ejecutamos para programar nuestra alarma:
Intent intent = new Intent(UPDATE_TIME);
PendingIntent pIntent = PendingIntent.getBroadcast(ctx,
0 /* no requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT );
// get alarm params
Date d = new Date();
long timeTilMinuteChange = 60*1000-d.getSeconds()*1000;
long startTime = System.currentTimeMillis() + + timeTilMinuteChange;
AlarmManager am = (AlarmManager) ctx.getSystemService(Context.
am.cancel(pIntent);
am.set(AlarmManager.RTC, System.currentTimeMillis(), pIntent);
am.setRepeating(AlarmManager.RTC, startTime, 60000, pIntent);
Acerca del administrador de alarmas en los Docs : la explicación es algo confusa y, sinceramente, todavía no lo entiendo completamente. Tengo este bit de código para la parte del widget que resolvió el problema en mi caso.
package com.test.mytestwidget;
import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
public class MyWidgetProvider extends AppWidgetProvider {
private PendingIntent service = null;
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Calendar TIME = Calendar.getInstance();
TIME.set(Calendar.MINUTE, 0);
TIME.set(Calendar.SECOND, 0);
TIME.set(Calendar.MILLISECOND, 0);
final Intent i = new Intent(context, UpdateWidgetService.class);
if (service == null)
{
service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 30000, service);
}
@Override
public void onDisabled(Context context)
{
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
m.cancel(service);
super.onDisabled(context);
}
}