5

Merhaba 3 dakika boyunca belirli bir zaman aralığı için alarm yöneticisi kullanıyorum ve izlemeye başladım. Bazen çalıştı ve aniden doğru olmayan düzensiz bir zaman aralığı olduğunu fark ettim! "20-Jul-2016 12:22:03" 'de saatinin değiştiğini görebilirsiniz. Telefonu bağladım ve ekranı kapatıp izledim! Her 3 dakikada bir, sunucuya vurdum ve yanıtı 1 olarak aldım. Ama bir kerede, sunucuyu vurmak 5 dakika sürüyor! Neden bu garip sorun oldu?Alarm Yöneticisi belirli bir zaman aralığında çalışmıyor

İşte kod.

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: Sen AlarmManager için resmi belgelerine de görebileceğiniz

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

cevap

5

setInexactRepeating'u kullanmayın. Bu, adından da anlaşılacağı gibi, alarmın tam olarak söndürülmesini planlamamaktadır. Alarmın bir çağrı aldığınızda başka üç dakikada çıkmak için başka alarm programı,

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); 
    } 
} 

:

Böyle bir şey kullanabilirsiniz. Cevabınız için teşekkürler bu here

+0

hakkında. Blogdan bir şüphem var. onReceive yönteminde, WrappedAlarmManager nedir? Kodumda ne kullanmam gerekiyor? – Shadow

+0

ayrıca sağdan bahsetmiş olduğunuz interval_seven saniye. ne vermeliyim – Shadow

+0

Buradaki kodu Github hesabımda bulabilirsiniz: https://github.com/hoombar/android-training/tree/master/src/net/rdyonline/android_training/alarms –

0

o Android sürümü 19 (KitKat), alarmlar başlayarak kesin olarak işaretlenmiş olsa bile zamanlanmış olacak (bir Zaten inexactRepeating() var.

Alarmlar, aygıtın uyanmasını en aza indirgemek için sistem olayları ve gördüğünüz pil kullanımını kullanır. Bu tasarım gereğidir.

İlgili konular