2013-04-30 3 views
0

У меня возникла проблема с запуском службы из диспетчера аварийных сигналов.Служба Android не запускается из AlarmManager

Я создаю приложение, которое уведомляет владельца об именах своих друзей в facebook. Все работает хорошо, но уведомление не появится.

Я создали AlarmTask, который создает PendingIntent и устанавливает AlarmManager, как это:

public void run() { 


    // Request to start are service when the alarm date is upon us 

    Intent intent = new Intent(context, NotifyService.class); 
    intent.putExtra(NotifyService.INTENT_NOTIFY, true); 
    intent.putExtra("notifyID", ID); 
    PendingIntent pendingIntent = PendingIntent.getService(context, ID, intent, 0); 

    // Sets an alarm - note this alarm will be lost if the phone is turned off and on again 
    am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent); 
} 

Идентификатор специфичен для каждого именины.

Теперь в моем NotifyService, я настроил эти:

@Override 
public void onCreate() { 
    super.onCreate(); 
    System.out.println("NOTIFICATION SERVICE onCreate()"); 
    mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    System.out.println("INTENT RECIEVED: " + intent + " " + flags + " " + startId); 

    // If this service was started by out AlarmTask intent then we want to show our notification 
    if(intent.getBooleanExtra(INTENT_NOTIFY, false)){ 
     int ID = intent.getIntExtra("notifyID", -1); 
     showNotification(ID); 
    } 
    // We don't care if this service is stopped as we have already delivered our notification 
    return START_STICKY; 
} 

Оба метода выполняются один раз, когда я запустить приложение, но когда уведомление должно прийти, ничего не происходит.

Есть ли способ проверить, действительно ли AlarmManager выполняет PendingIntent? Должен ли я использовать IntentService? Почему как?

Большое спасибо.

Я попытался изменить его BroadcastReciever, глядя, как это:

public class NotificationBroadcastReciever extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 
    System.out.println("BROADCAST RECIEVED"); 

} 

}

Бит AlarmTask изменяется на это:

Intent intent = new Intent("NotificationBroadcast"); 
    intent.putExtra(NotifyService.INTENT_NOTIFY, true); 
    intent.putExtra("notifyID", ID); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), ID, intent, 0); 
    System.out.println("date for notification: " + date.get(Calendar.DAY_OF_MONTH) + "." + date.get(Calendar.MONTH) + "." + date.get(Calendar.YEAR)); 
    System.out.println("epoch time in milils: " + date.getTimeInMillis()); 
    // Sets an alarm - note this alarm will be lost if the phone is turned off and on again 
    am.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), pendingIntent); 

и соответствующая манифеста часть выглядит следующим образом :

<receiver 
     android:name="cz.cvut.kubispe2.jmeniny.NotificationBroadcastReciever" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="NotificationBroadcast" /> 
     </intent-filter> 
    </receiver> 

Я проверил, установлена ​​ли дата, которая должна быть установлена, равным времени эпохи, и это все же, метод onRecieve никогда не вызывается.

+0

Вы хотите добавить задержку в am.set()? date.getTimeInMillis() + DELAY_IN_MILLIS – yoah

+0

Я пытаюсь запустить уведомление в указанную дату (здесь дата является экземпляром календаря с информацией об уведомлении), поэтому я не думаю, что потребуется задержка –

+0

Из вашего описания , служба начинается с момента запуска приложения, которое похоже на то, что время сейчас или в прошлом, а не в будущем. В противном случае, почему служба запускается при запуске приложения? Добавьте сообщения журнала, ваш код выглядит нормально. – yoah

ответ

0

попробуйте использовать контекст приложения.

PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), ID, intent, 0); 

И работать с android logs. Затем вы увидите, работает ли в вашей консоли.

+0

Я пробовал контекст приложения, но он все еще не работает. Кроме того, я вижу System.out в своем Eclipse LogCat. Я знаю, что это не очень андроид, но у меня мало времени, и для меня это изменится. Спасибо хоть. –

2

Оба метода выполняются один раз при запуске приложения, но при появлении уведомления ничего не происходит.

_WAKEUP тревоги гарантируется только разбудить устройство, если они путь к BroadcastReceiver, а не Service. Пока что вы делаете очень коротко (1-2 миллисекунды), вы можете смело выполнять эту работу в onReceive() из BroadcastReceiver. Работа, которую вы сейчас выполняете в своем Service, будет квалифицироваться.

Помимо этого, используйте adb shell dumpsys alarm, чтобы подтвердить, что ваш будильник запланирован, когда вы думаете.

Должен ли я использовать IntentService?

Это, безусловно, лучший вариант, чем обычный Service, который вы испытываете в своей текущей реализации. Однако ограничение _WAKEUP по-прежнему сохраняется, поэтому I wrote WakefulIntentService, чтобы помочь преодолеть разрыв. Опять же, хотя с текущей ограниченной работой, которую вы выполняете, достаточно использовать только BroadcastReceiver.

+0

Хорошо, я не уверен, как читать журнал dumpsys. Это пример записи из журнала, можете ли вы помочь мне понять, что это значит? RTC_WAKEUP # 35: Сигнализация {44e31838 тип 0 cz.cvut.kubispe2.jmeniny} тип = 0, когда = 1369227635942 repeatInterval = 0 кол = 0 операция = PendingIntent {44ea5ac8: PendingIntentRecord {44f34048 cz.cvut.kubispe2. jmeniny broadcastIntent}} –

+0

@ PetrKubišta: Вы можете протестировать новое устройство или эмулятор. «Когда» вы видите, вероятно, миллисекунды, начиная с-Unix-эпохи. В более новых средах формат должен быть больше, чем 'when = + 11h1m38s567ms', показывающий часы/минуты/секунды/миллисекунды до тех пор, пока не произойдет событие. – CommonsWare

+0

Я попытался изменить его на приемник вещания, как вы предлагали, но функциональных возможностей по-прежнему нет. Я обновил код до вопроса. Есть еще предложения? –

0

Похоже, что я, наконец, разрешил это, я использовал приемник трансляции и выяснил, где была ошибка. Календарь принимает аргумент месяца от 0 до 11, а не 1-12, который я думал, поскольку все остальные аргументы обычно рассматриваются. Поэтому я просто выставлял уведомление в конце мая, а не сегодня, при тестировании.

В любом случае, спасибо всем за помощь, это было очень признательно.

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