2

У меня есть следующий приемник вещания, который вызывается, когда телефон загружается (Bootreciever.java), и я пытаюсь запустить службу, которая работает периодически с использованием повторяющегося сигнала тревоги.Запуск службы через Alarm не работает

public void onReceive(Context context, Intent intent) { 

    Toast.makeText(context,"Inside onRecieve() :D" , Toast.LENGTH_LONG).show(); 
    Log.d(getClass().getName(), "Inside onRecieve() :D"); 


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


    Intent i = new Intent(context, MyService.class); 

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + 3000, 1000, pi); 

} 

В принципе, я устанавливаю повторяющийся сигнал тревоги, чтобы вызвать три секунды и каждую секунду после этого. Полная трансляция загрузки полностью получена, но служба не запускается. MyService.java выглядит следующим образом:

public class MyService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Toast.makeText(this, "Hello from MyService!", Toast.LENGTH_LONG); 

     Log.d(getClass().getName(), "Hello from MyService!"); 

     stopSelf(); 

     return super.onStartCommand(intent, flags, startId); 
    } 

Что я делаю неправильно при запуске службы?

Logcat ничего мне не говорит, и у меня есть служба, определенная в моем манифесте. Сама по себе эта услуга работает при вызове с использованием startService(), но, похоже, не работает при использовании в пределах PendingIntent.

+0

попробовать 'context.getApplicationContext()' вместо контекста в синтаксисе PendingIntent. – Lucifer

ответ

6

Вместо PendingIntent.getBroadcast() использования PendingIntent.getService()

+0

Ой! Неверный вызов метода. Спасибо что подметил это. Работает сейчас. –

+2

Пожалуйста, не отправляйте ответы в одной строке. Объясните проблему. -1 – Manishearth

+9

@Manishearth я не хочу. – Cristian

1

Я думаю, вы должны проверить длительность, потому что андроид получает немного разборчив с сигналами тревоги, которые вызывают слишком часто. Для того, чтобы начать сервис, лучший способ - настроить будильник для трансляции намерения в приемник broacast, а затем заставить его начать ваши услуги.

Пример 1 приемник:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class QoutesReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // log instruction 
     Log.d("SomeService", "Receiving Broadcast, starting service"); 
     // start the qoute service 

     Intent newService = new Intent(context, SomeService.class); 
     context.startService(newService); 
    } 

} 

Пример 2 Функция, которая устанавливает сигнализацию (в этом примере выполняется каждые 2 минуты):

public void setAlarm(Context context) { 


     // Get the current time 
     Calendar currTime = Calendar.getInstance(); 

     // Get the intent (start the receiver) 
     Intent startReceiver = new Intent(context, MyReceiver.class); 

     PendingIntent pendReceiver = PendingIntent.getBroadcast(context, 0, 
       startReceiver, PendingIntent.FLAG_CANCEL_CURRENT); 

     // call the Alarm service 
     AlarmManager alarms = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 
     //Setup the alarm 

     alarms.setRepeating(AlarmManager.RTC_WAKEUP, 
       currTime.getTimeInMillis() + (2 * 60 * 1000), 2 * 60 * 1000, 
       pendReceiver); 
    } 
Смежные вопросы