5

Hallo Ich benutze Alarm Manager für spezifische Zeitintervalle für 3 Minuten und ich begann mit der Überwachung. Es funktionierte für manchmal und plötzlich bemerkte ich, dass es unregelmäßige Zeitintervalle gibt, die nicht korrekt sind! Sie können in beigefügten Protokoll sehen, wo bei "20-Jul-2016 12:22:03 pm" Zeit variiert! Ich habe das Telefon angeschlossen und den Bildschirm ausgeschaltet und überwacht! wo ich alle 3 Minuten den Server treffe und die Antwort als 1 erhalte. Aber auf einmal dauert es 5 Minuten, um den Server zu treffen! Warum ist dieses seltsame Problem passiert?Alarm Manager funktioniert nicht in einem bestimmten Zeitintervall

Hier ist Code.

public void startAt3() { 
    Intent alarmIntent = new Intent(ActivityTracking.this, AlarmReceiver.class); 
    pendingIntent = PendingIntent.getBroadcast(ActivityTracking.this, 0, alarmIntent, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
         /* Set the alarm */ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    /* Repeating on every 3 minute interval */ 
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), 
      180000L, pendingIntent); 
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 
    Log.e("alarm",mydate); 

} 

AlarmReceiver:

public class AlarmReceiver extends WakefulBroadcastReceiver {//AlarmReceiver class 
@Override 
public void onReceive(Context context, Intent intent) {//onReceive method 
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 
    Log.e("alarm",mydate); 
    Intent service = new Intent(context, SimpleWakefulService.class);//intent to call another class 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, service);//service started 
} 

SimpleWakefulService:

public class SimpleWakefulService extends IntentService { 
     public SimpleWakefulService() { 
     super("SimpleWakefulService");//instantiates simpleWakefulService 

    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.e("simpleWakeful","simpleWakeful"); 
     serviceCall(this); //here is downloadTaskMethod called and getting response as 1. 
    } 

enter image description here

Antwort

5

Verwenden Sie nicht setInexactRepeating. Dies, wie der Name schon sagt, sieht nicht vor, dass der Alarm zu einem bestimmten Zeitpunkt ausgelöst wird.

Sie können so etwas wie folgt verwenden:

public void scheduleSingleAlarm(Context context) { 
    Intent intent = new Intent(context, NotificationReceiver.class); 
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(context, 
      SINGLE_ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    Calendar futureDate = Calendar.getInstance(); 
    futureDate.add(Calendar.MINUTE, 3); 

    setSingleExactAlarm(futureDate.getTime().getTime(), pendingUpdateIntent); 
} 

@SuppressLint("NewApi") 
private void setSingleExactAlarm(long time, PendingIntent pIntent) { 
    if (android.os.Build.VERSION.SDK_INT >= 19) { 
     mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } else { 
     mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } 
} 

Wenn Sie einen Anruf von der Alarm erhalten, einen anderen Alarm planen in weiteren drei Minuten vor Schluss aus. Ich habe darüber gebloggt here

+0

danke für Ihre Antwort. Ich habe einen Zweifel vom Blog. in onReceive-Methode, was ist WrappedAlarmManager? Was muss ich in meinem Code verwenden? – Shadow

+0

auch interval_seven Sekunden haben Sie richtig erwähnt. Was soll ich geben? – Shadow

+0

Der Code ist auf meinem Github-Konto hier verfügbar: https://github.com/hoombar/android-training/tree/master/src/net/rdyonline/android_training/alarms –

0

Sie von der offiziellen Dokumentation Alarmmanager sehen, dass 19 (KitKat) ab Android-Version starten, Alarme geplant wird ungenau sein, auch wenn sie genau markiert wurden (a Obwohl Sie bereits inexactRepeating()) haben.

Die Alarme werden mit Systemereignissen gebündelt, um das Aufwachen des Geräts und den Batterieverbrauch zu minimieren, was Sie sehen. Das ist Absicht.