Problem mit AlarmManager, Aktion wird nicht ausgeführt

H

Hungrig

Erfahrenes Mitglied
37
Hallo,

ich habe einen AlarmManager, der alle X Sekunden eine Aufgabe erledigen soll. Leider wird der entsprechende Code nicht aufgerufen. Der Dienst läuft, denn
"AlarmManager gesetzt" ist im LogCat zu lesen.
Im Beispielfall müsste nun alle 10 Sekunden "Alarmreceiver" im LogCat erscheinen. Leider passiert aber gar nichts.

Wo ist der Fehler?

Hier ist der Code
Code:
public class TestService extends Service
{
    Context context;
    
    
    AlarmReceiver meinAlarmReceiver;    
    
    
    @Override
    public void onCreate()
    {
        context = getApplicationContext();        
        meinAlarmReceiver = new AlarmReceiver();
        registerReceiver(meinAlarmReceiver, new IntentFilter());
        int keepAlive = 10; //Every 10 seconds
        System.out.println("AlarmManager gesetzt");
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context,TestService.class);
        //Intent i = new Intent(context,TestService.AlarmReceiver.class); //Egal ob hier TestService.class oder TestServiceAlarmReceiver.class steht, es funktioniert nicht
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        //am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + keepAlive * 1000, keepAlive * 1000, pi);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), keepAlive * 1000, pi);
    }

            

    @Override
    public void onDestroy()
    {
        
        super.onDestroy();
    }


    @Override
    public IBinder onBind(Intent intent)
    {
        // TODO Auto-generated method stub
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        System.out.println("On StartCommand");
        return START_STICKY;
    }


    

    class AlarmReceiver extends BroadcastReceiver
    {

        public void onReceive(Context context, Intent intent)
        {
            System.out.println("Alarmreceiver");            
        }

    }

}
 
Ich weiß schon, dass sysout nicht auf dem Androiden angezeigt wird. Aber es erscheint ja im Logcat bzw. in diesem Fall eben nicht. Die Ausgabe von "On StartCommand" sehe ich ja im Logcat. Du kannst bei der Ausgabe von "Alarmreceiver" auch eine Toastnotification setzen, auch diese wird nicht angezeigt werden, weil der ganze Code da aus irgendeinem Grund nicht aufgerufen wird.
 
du musst deinen receiver im manifest eintragen
 
Kannst du das etwas weiter begründen? Ich habe den Quellcode hier deutlich vekürzt. In diesem Quellcode habe ich noch einen weiteren Broadcast-Receiver, der auf Netzwerkstatusänderungen reagiert. Dieser ist auch nicht im Manifest eingetragen, sondern wird dynamisch via registerReceiver registriert. Der Broadcast soll ja nur zuschlagen, wenn der Dienst auch läuft. Hier http://stackoverflow.com/questions/4462037/register-receiver-in-a-service ist das schön erklärt. Eine Permission sollte ich nicht brauchen, da ich es mir ja selbst schicke, oder doch und das war der Fehler? Wenn ja welche Permission brauche ich dann?
 
Weiß denn keiner weiter? Mit BetterBatteryStats habe ich nun immerhin rausgefunden, dass der AlarmManager zumindest zuschlägt. Nur der Code des Broadcast-Receivers wird leider nicht aufgerufen.
 
Ich habe es herausgefunden woran es liegt. 2 Zeilen müssen geändert werden:
registerReceiver(meinAlarmReceiver, new IntentFilter("Blabla"));
Der Intentfilter braucht also einen String als Argument. Dieser String wird übrigens in Better Battery Stats unter "Alarms" angezeigt.
Statt Intent i = new Intent(context,TestService.class);
muss es heißen Intent i = new Intent("Blabla");

Dann klappt alles. Also nochmal der ganze korrekte Code.
Code:
public class TestService extends Service
{
    Context context;
    
    
    AlarmReceiver meinAlarmReceiver;    
    
    
    @Override
    public void onCreate()
    {
        context = getApplicationContext();        
        meinAlarmReceiver = new AlarmReceiver();
       registerReceiver(meinAlarmReceiver, new IntentFilter("Blabla")); 
        int keepAlive = 10; //Every 10 seconds
        System.out.println("AlarmManager gesetzt");
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent("Blabla");
        //Intent i = new Intent(context,TestService.AlarmReceiver.class); //Egal ob hier TestService.class oder TestServiceAlarmReceiver.class steht, es funktioniert nicht
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        //am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + keepAlive * 1000, keepAlive * 1000, pi);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), keepAlive * 1000, pi);
    }

            

    @Override
    public void onDestroy()
    {
        
        super.onDestroy();
    }


    @Override
    public IBinder onBind(Intent intent)
    {
        // TODO Auto-generated method stub
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        System.out.println("On StartCommand");
        return START_STICKY;
    }


    

    class AlarmReceiver extends BroadcastReceiver
    {

        public void onReceive(Context context, Intent intent)
        {
            System.out.println("Alarmreceiver");            
        }

    }

}

Seltsamerweise finde ich das nie in den ganzen Beispielcodes im Internet. Wie auch immer, jetzt funktioniert es.
 

Ähnliche Themen

S
  • Sempervivum
Antworten
2
Aufrufe
593
Sempervivum
S
S
Antworten
4
Aufrufe
954
Sempervivum
S
B
Antworten
4
Aufrufe
430
bb321
B
Zurück
Oben Unten