2010-06-27 3 views
1

У меня есть приложение, которое вызывает 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 вместо убийцы задачи на устройстве, тогда будильник будет срабатывать и работать, как ожидалось.

Может кто-нибудь помочь мне понять, почему это происходит? У меня создалось впечатление, что после того, как будильник был запланирован, он будет сохраняться, если устройство не перезагрузится. Устройство пробуждается во время выполнения тревоги.

ответ

4

и в Manifiest я имею обязательную запись

android:process=":remote" анти-обязательно. Удалите его. Быстро.

На реальном устройстве, если я начну MyApplication, добавить тревогу, а затем убить процесс с помощью Task Killer

задач убийц удалить тревоги в приложение, а также, хотя этот вопрос решается с Android 2.2.

+0

Я видел это ': remote' здесь-там. Что используется и когда нам нужно? – Pentium10

+0

ответ на этот вопрос Mark – JDM

+1

@ Pentium10: он заставляет компонент (в данном случае, «BroadcastReceiver») запускаться в отдельном процессе от других компонентов. Учитывая, насколько сильно большинство устройств Android находятся в ОЗУ, я не знаю, почему приложение SDK должно его использовать. – CommonsWare

Смежные вопросы