AlarmManager disparando no emulador, mas não no dispositivo físico
Eu tenho um aplicativo que chama 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);
e no Manifiest eu tenho a entrada obrigatória
<receiver android:name=".MyEventReceiver"
android:process=":remote" />
MyEventReceiver aparece assim
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());
}
}
}
Quando o alarme é ativado, o MyEventReceiver deve ser iniciado e fazer alguma coisa, mesmo que meu aplicativo não esteja sendo executado. No emulador, este é o caso, no entanto, no dispositivo real, esse não é o caso.
Como exemplo, iniciarei o MyApplication no emulador e no DDMS posso ver o processo do MyApplication em execução. No MyApplication, adiciono um alarme e, no DDMS, interrompo o processo para o MyApplication. Quando o alarme dispara, o MyEventReceiver faz seu trabalho e, no DDMS, vejo dois processos, MyApplication e MyApplication: remote.
Em um dispositivo real, se eu iniciar o MyApplication, adicione um alarme e interrompa o processo usando um killer de tarefas quando chegar a hora do alarme executar, nada acontece. Se eu conectar meu dispositivo ao depurador e parar o processo usando DDMS em vez do assassino de tarefas no dispositivo, o alarme disparará e funcionará conforme o esperado.
Alguém pode me ajudar a entender por que isso está acontecendo? Fiquei com a impressão de que, uma vez agendado o alarme, ele persistiria, a menos que o dispositivo fosse reiniciado. O dispositivo está acordado no momento em que o alarme deve ser executado.