2013-06-12 4 views
0

У меня есть сервис (должным образом объявленный в файле манифеста), который после onDestroy() планирует начать снова через минуту через AlarmManager. Однако служба не запускается, хотя onDestroy() работает правильно. Что может быть неправильным?Служба Android, запланированная на AlarmManager, не запускается

Код планирования:

@Override 
public void onDestroy() { 

    BroadcastReceiver br = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context c, Intent i) { 
      c.startService(new Intent(c, MyService.class)); 
     } 
    }; 

    registerReceiver(br, new IntentFilter("xxxx")); 

    PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent("xxxx"), 0); 

    AlarmManager am = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 

    am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + ONE_MINUTE, pi); 

    Log.i("onDestroy", "Service scheduled."); 

    unregisterReceiver(br); 

    super.onDestroy(); 
} 

Служба декларации в файле манифеста:

<service 
    android:name="com.xxxx.MyService" 
    android:exported="true"> 
</service> 
+0

Поскольку вы создаете ресивер в onDestroy, это может привести к разрушению приемника. – neo

ответ

3

Во-первых, ваш BroadcastReceiver уходит наносекунд после окончания onDestroy(), что делает его бесполезным. Зарегистрируйте свой BroadcastReceiver в манифесте с помощью элемента <receiver>.

Во-вторых, сигнализация _WAKEUP позволяет устройству проснуться достаточно долго, чтобы обработать onReceive() в BroadcastReceiver. Вам нужно использовать WakeLock, чтобы устройство не спало дольше, чем это. В зависимости от того, что вы делаете, my WakefulIntentService может пригодиться.

В-третьих, вам не нужно экспортировать ваши услуги, и при этом вы открываете потенциальные дыры в безопасности. Рекомендую удалить android:exported="true".

+0

Спасибо! Является ли регистрация моего BroadcastReceiver важным? Я должен каким-либо образом создать экземпляр этого кода в коде, и в зависимости от точки создания экземпляра он может быть еще наносекундами или больше от уничтожения экземпляра, поэтому не стоит ли отвлекать его от onDestroy()? Во-вторых, «в зависимости от того, что вы делаете», я предполагаю, что вы имеете в виду «в зависимости от того, сколько секунд ваш сервис будет запущен» из-за 10-секундного разрыва блокировки слежения, правильно? Если задача сама по себе имеет значение, это: просыпаться около 30 секунд, приобретая места GPS и отправляя их на сервер. Еще раз спасибо! – Piovezan

+0

@Piovezan: «Является ли регистрация моего BroadcastReceiver важным?» - если вы хотите, чтобы он получал трансляции, да. «Мне все равно нужно создавать экземпляр в коде» - почему? «из-за 10-секундного замка блокировки следа, верно?» - Я не знаю, что вы подразумеваете под «10-секундным замком блокировки». Устройства могут засыпать менее чем через 10 секунд после освобождения «WakeLock». «просыпаться около 30 секунд, приобретая места GPS и отправляя их на сервер» - вы можете изучить «LocationPoller», затем: https://github.com/commonsguy/cwac-locpoll – CommonsWare

+0

«10- второй промежуток блокировки следа "Я имею в виду то, что указано в документации onReceive() Android http://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context, android.content. Намерение), если они не разные. Если мне не нужно создавать экземпляр моего BroadcastReceiver в коде, мне очень жаль, но я еще не нашел, как получить доступ к его экземпляру. – Piovezan

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