2017-09-19 23 views
9

ứng dụng của tôi sử dụng mô hình cổ điển này để sắp xếp công việc định kỳ:Tôi nên di chuyển ứng dụng của mình để sử dụng JobScheduler như thế nào?

  1. Đặt chuông báo thức chính xác qua AlarmManager (thông qua setExactAndAllowWhileIdle(), vì nó có để đi tắt ngay cả trong Nữu Thừa)
  2. Bắt đầu một IntentService từ onReceive() qua WakefulBroadcastReceiver.startWakefulService()
  3. Thực hiện công việc trong onHandleIntent() và gọi WakefulBroadcastReceiver.completeWakefulIntent() khi hoàn tất.

Hôm nay tôi cập nhật các targetSdkVersion đến 26 và phải đối mặt với một thực tế khủng khiếp mà WakefulBroadcastReceiver bị phản.

tôi đã đi để đọc tài liệu API ngay lập tức và tìm thấy những điều sau đây:

Tính đến Android O, hạn chế kiểm tra lý lịch làm cho lớp này không còn thường hữu ích. (Nói chung không an toàn khi bắt đầu một dịch vụ từ khi nhận được một phát sóng, bởi vì bạn không có bất kỳ đảm bảo nào rằng ứng dụng của bạn đang ở nền trước tại thời điểm này và do đó được phép làm như vậy.) Thay vào đó, nhà phát triển nên sử dụng android.app.job.JobScheduler để lập lịch công việc và điều này không yêu cầu ứng dụng giữ khóa chế độ trong khi làm như vậy (hệ thống sẽ đảm nhiệm việc giữ khóa đánh thức cho công việc).

Điều này gây nhầm lẫn cho tôi, tôi thực sự không hiểu mục đích của AlarmManager.setExactAndAllowWhileIdle() là gì mà không thể giữ thiết bị luôn tỉnh táo nữa.

Như tôi thấy tôi không thể đặt thời gian chính xác để chạy công việc với JobScheduler, chỉ điều kiện (chẳng hạn như loại mạng hoặc trạng thái sạc) nên tôi không biết phải làm gì ở đây.

Tôi nghĩ một trong hai

  • Sử dụng AlarmManagerJobScheduler cùng

    Cài âm báo (với setExactAndAllowWhileIdle()) và bắt đầu một công việc (thông qua JobScheduler) ngay lập tức từ onReceive(). Vì JobScheduler cung cấp WakeLock, WakefulBroadcastReceiver là không cần thiết.

    (make này có ý nghĩa?)

hoặc

  • tiếp tục sử dụng WakefulBroadcastReceiver dù đã được tán thành.

Tôi thực sự đánh giá cao bất kỳ lời khuyên nào về vấn đề này.

+0

đã bạn tìm thấy câu trả lời nay ??? –

Trả lời

0

Trong android-o và sau đó bạn có thể xác định một nhiệm vụ lặp đi lặp lại mà không alarmmanager như thế này:

// schedule the start of the service "TestJobService" every 10 - 30 minutes 
public static void scheduleJob(Context context) { 
    ComponentName serviceComponent = new ComponentName(context, TestJobService.class); 
    JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent); 
    builder.setMinimumLatency(10 * 60 * 1000); // wait at least 
    builder.setOverrideDeadline(30 * 60 * 1000); // maximum delay 
    JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); 
    jobScheduler.schedule(builder.build()); 
} 
Các vấn đề liên quan