AlarmManager disparando en el emulador pero no en el dispositivo físico
Tengo una aplicación que llama a AlarmManager
Intent intent;
intent = new Intent(context, MyEventReceiver.class);
PendingIntent appIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
appIntent);
y en el Manifiesto tengo la entrada obligatoria
<receiver android:name=".MyEventReceiver"
android:process=":remote" />
MyEventReceiver se ve así
public class MyEventReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
try
{
// DO SOME WORK
}
catch (Exception e)
{
Log.e("MyEventReceiver", e.getMessage().toString());
}
}
}
Cuando se activa la alarma, MyEventReceiver debe iniciarse y hacer algo incluso si mi aplicación no se está ejecutando. En el emulador este es el caso, sin embargo, en el dispositivo real, este no es el caso.
Como ejemplo, iniciaré MyApplication en el emulador y en DDMS puedo ver el proceso para MyApplication ejecutándose. Desde MyApplication agrego una alarma y luego, dentro de DDMS, elimino el proceso para MyApplication. Cuando se activa la alarma, MyEventReceiver hace su trabajo y en DDMS veo dos procesos, MyApplication y MyApplication: remoto.
En un dispositivo real si inicio MyApplication, agrego una alarma y luego elimino el proceso usando un asesino de tareas cuando llega el momento de que la alarma no se ejecute. Si conecto mi dispositivo al depurador y detengo el proceso usando DDMS en lugar del asesino de tareas en el dispositivo, la alarma se disparará y funcionará como se esperaba.
¿Alguien puede ayudarme a entender por qué sucede esto? Tenía la impresión de que una vez que se programara la alarma, persistiría a menos que se reiniciara el dispositivo. El dispositivo está despierto en el momento en que se debe ejecutar la alarma.