У меня есть приложение, которое вызывает AlarmManagerAlarmManager стрельбы в эмуляторе, но не на физическом устройстве
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);
и в Manifiest у меня есть обязательный вход
<receiver android:name=".MyEventReceiver"
android:process=":remote" />
MyEventReceiver выглядит как этот
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());
}
}
}
Когда активирован будильник, необходимо запустить MyEventReceiver и сделать что-то ev ru, если мое приложение не запущено. В эмуляторе это имеет место, однако на самом устройстве это не так.
В качестве примера я запустил MyApplication на эмуляторе и в DDMS, я вижу процесс запуска MyApplication. Изнутри MyApplication я добавляю будильник, а затем в DDMS уничтожаю процесс для MyApplication. Когда срабатывает тревога, MyEventReceiver выполняет свою работу, а в DDMS я вижу два процесса: MyApplication и MyApplication: remote.
На самом устройстве, если я запустил MyApplication, добавьте будильник, а затем убейте процесс, используя убийцу задачи, когда придет время, чтобы сигнал тревоги ничего не выполнял. Если я подключу свое устройство к отладчику и остановит процесс с помощью DDMS вместо убийцы задачи на устройстве, тогда будильник будет срабатывать и работать, как ожидалось.
Может кто-нибудь помочь мне понять, почему это происходит? У меня создалось впечатление, что после того, как будильник был запланирован, он будет сохраняться, если устройство не перезагрузится. Устройство пробуждается во время выполнения тревоги.
Я видел это ': remote' здесь-там. Что используется и когда нам нужно? – Pentium10
ответ на этот вопрос Mark – JDM
@ Pentium10: он заставляет компонент (в данном случае, «BroadcastReceiver») запускаться в отдельном процессе от других компонентов. Учитывая, насколько сильно большинство устройств Android находятся в ОЗУ, я не знаю, почему приложение SDK должно его использовать. – CommonsWare