5

Xin chào, tôi đang sử dụng Trình quản lý báo thức cho khoảng thời gian cụ thể trong 3 phút và tôi bắt đầu theo dõi. Nó làm việc cho đôi khi và đột nhiên tôi nhận thấy có khoảng thời gian không thường xuyên mà không phải là chính xác! Bạn có thể xem trong nhật ký được đính kèm tại thời điểm "20-Jul-2016 12:22:03 pm" thời gian khác nhau! Tôi kết nối điện thoại và tắt màn hình và theo dõi! 3 phút một lần, tôi nhấn máy chủ và nhận phản hồi là 1. Nhưng tại một thời điểm, phải mất 5 phút để nhấn máy chủ! Tại sao vấn đề kỳ lạ này lại xảy ra?Trình quản lý báo thức không hoạt động ở khoảng thời gian cụ thể

Đây là mã.

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

Trả lời

5

Không sử dụng setInexactRepeating. Điều này, như tên cho thấy, không lên lịch báo thức để đi ra tại một thời điểm chính xác.

Bạn có thể sử dụng một cái gì đó như thế này:

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

Khi bạn nhận được một cuộc gọi từ các báo thức, lịch trình báo động khác để đi tắt trong ba phút nữa. Tôi đã viết blog về điều này here

+0

cảm ơn câu trả lời của bạn. Tôi có một nghi ngờ từ blog. trong phương thức onReceive, WrappedAlarmManager là gì? những gì tôi cần phải sử dụng trong mã của tôi? – Shadow

+0

cũng interval_seven giây bạn đã đề cập ngay. những gì tôi nên cho? – Shadow

+0

Mã có sẵn trên tài khoản Github của tôi tại đây: https://github.com/hoombar/android-training/tree/master/src/net/rdyonline/android_training/alarms –

0

Bạn có thể nhìn thấy từ các tài liệu chính thức cho AlarmManager rằng bắt đầu từ Android phiên bản 19 (KitKat), báo động được lên lịch sẽ không chính xác ngay cả khi chúng được đánh dấu chính xác (một Mặc dù bạn đã có inexactRepeating()).

Báo thức sẽ được kết hợp với các sự kiện hệ thống để giảm thiểu việc đánh thức thiết bị và sử dụng pin là những gì bạn đang thấy. Điều này là do thiết kế.

Các vấn đề liên quan