2013-04-08 14 views
6

Ich baue eine Taxi-Buchungs-App, ich brauche alle 20 Sekunden den aktuellen Standort der Kabine.onReceiver von BroadcastReceiver nicht angerufen, AlarmManager

Ich habe einen AlarmManager definiert und muss sich alle 20 Sekunden wiederholen. Aber es wiederholt sich nicht regelmäßig. Stattdessen wiederholte es sich nach 233 Sekunden und nur einmal. Was mache ich hier falsch?

My Homescreen hat eine innere Klasse OnAlarmReceiver im onCreate meiner Homescreen Ich rufe Alarmmanager

AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(this, OnAlarmReceiver.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.SECOND, 20); 
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      cal.getTimeInMillis(), God.UPDATE_PENDING_INTERVAL, pi); 

Innenklasse in Homescreen

public class OnAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // PullPendingRequests.acquireStaticLock(context); 
     Toast.makeText(context, "Don't panik but your time is up!!!!.", Toast.LENGTH_LONG) 
       .show(); 
     Log.d("Taxeeta:PullPendingRequets", "CallService Location"); 
     context.startService(new Intent(context, PullPendingRequests.class)); 
    } 
} 

Meine AndroidManifest Datei hat

<service 
     android:name="com.taxeeta.support.PullPendingRequests" 
     android:enabled="true" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.Light.NoTitleBar" /> 

    <receiver android:name=".com.taxeeta.HomeScreen.OnAlarmReceiver" /> 
</application> 

Ausgabe von adb shell dumpsys alarm

com.taxeeta 
    51471ms running, 5248 wakeups 
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver 

Ausgabe von adb shell dumpsys alarm | grep taxeeta

ELAPSED_WAKEUP #7: Alarm{409303b0 type 2 com.taxeeta} 
    operation=PendingIntent{408ba2d8: PendingIntentRecord{40887be8 com.taxeeta broadcastIntent}} 
com.taxeeta 
    5248 alarms: flg=0x4 cmp=com.taxeeta/.HomeScreen$OnAlarmReceiver 

Antwort

10

Um es zu beheben, entfernte ich die innere Klasse OnAlarmReceiver und reparierte die Datei androidmanifest.xml.

<receiver 
     android:name="com.taxeeta.support.OnAlarmReceiver" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.NOTIFY" /> 
     </intent-filter> 
    </receiver> 
0

Dieses Stück Code für mich gearbeitet und stellen Sie sicher, dass Sie reciever in Android-Manifest-Datei hinzugefügt haben.

AlarmManager service = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, OnAlarmReceiver.class); 
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i, 
         PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar cal = Calendar.getInstance(); 
// Start 20 seconds after boot completed 
cal.add(Calendar.SECOND, 20); 
// 
// Fetch every 20 seconds 
// InexactRepeating allows Android to optimize the energy consumption 
service.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
         cal.getTimeInMillis(), 1000*20, pending); 
+1

Nein, funktioniert nicht. OnAlarmReceiver, onReceive wird auch nicht aufgerufen. – Siddharth

+0

Auch hier funktioniert nichts auf Alarmmanager für mich. Ich habe alle Vorschläge dafür ausprobiert. Nicht sicher, was ich tun soll – JPM

0

Wenn die Antwort für Sie nicht oben nicht funktionieren, dann gibt es eine andere Art und Weise zu nicht keine Rückrufe erhalten, wenn AlarmManager Brände eines abgelaufener Alarm. Sie müssen nur dieses eine überprüfen: durch Senden der falschen Intent Instanziierung von PendingIntent. Zum Beispiel wollten Sie einen Anruf onReceive auf einem Ihrer Empfänger erhalten, aber Sie haben eine PendingIntent über getActivity oder getService instanziiert, aber was Sie eigentlich meinte, ist getReceiver.

Wenn Instanz PendingIntent erstellen, gibt es viele Möglichkeiten, es zu schaffen (getService, getActivity, getReceiver, getForegroundService:

wenn Sie Activity der Empfänger der Absicht wollen, dann Sie:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

wenn Sie wollen BroadcastReceiver den Empfänger der Absicht:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*); 

, wenn Sie einen Vordergrund Service der Empfänger der Absicht wollen:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*); 
auf die richtige Klasse

Stellen Sie außerdem sicher, dass Sie Absichten verweisen:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*); 

, wenn Sie einen Service der Empfänger der Absicht wollen . (z. B. Erstellen von Absichten für Aktivität, Service usw.). Sie werden nicht jeden Anruf erhalten, wenn Sie diese zu Unrecht wie passieren:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver 

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this. 
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

Ich stellte auch ähnliche Antwort here.

HTH

Verwandte Themen