2016-09-22 18 views
7

Một phần câu hỏi của tôi, cách tôi có thể thiết lập công việc với khoảng thời gian ít hơn 15 phút trong "Nougat", được trả lời bởi "bão tuyết" trong câu trả lời của mình tại đây:
Job Scheduler not running on Android N
Ông giải thích vấn đề và đề nghị sử dụng workaround sau:công việc lên lịch trong android N với khoảng thời gian ít hơn 15 phút

JobInfo jobInfo; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
    jobInfo = new JobInfo.Builder(JOB_ID, serviceName) 
     .setMinimumLatency(REFRESH_INTERVAL) 
     .setExtras(bundle).build(); 
} else { 
    jobInfo = new JobInfo.Builder(JOB_ID, serviceName) 
     .setPeriodic(REFRESH_INTERVAL) 
     .setExtras(bundle).build(); 
}  

Tuy nhiên, bằng cách sử dụng đề nghị

.setMinimumLatency(REFRESH_INTERVAL)  

chỉ bắt đầu công việc một lần;
nhưng làm thế nào để làm cho nó định kỳ với khoảng thời gian khoảng 30 giây trên một thiết bị nougat android (không sử dụng trình xử lý hoặc trình quản lý báo thức)?

+2

Thực hiện điều gì đó sau mỗi 30 giây, trừ khi ứng dụng của bạn ở mặt trước và chủ động được người dùng sử dụng, không phù hợp trong mắt người dùng, người đã phàn nàn lớn về mức tiêu thụ pin của ứng dụng nền. – CommonsWare

+0

Tuy nhiên, nếu bạn có người dùng muốn có thông tin mới nhất có sẵn khi họ bắt đầu điện thoại của họ (có thể họ hiện không có internet ...), người dùng cần dịch vụ nền đáng tin cậy. Hay bạn đang cố gắng nói với tôi, rằng điều này chỉ đơn giản là không thể? Sau đó, bạn có thể làm như vậy, mà không cố gắng để dạy cho tôi về những điều tôi biết. – tomseitz

+1

"nếu bạn có người dùng muốn có thông tin mới nhất có sẵn khi họ khởi động điện thoại" - điều đó không yêu cầu thực hiện công việc cứ 30 giây một lần. "Hay bạn đang cố gắng nói với tôi, rằng điều này chỉ đơn giản là không thể?" - không có gì sẽ thực hiện điều này một cách đáng tin cậy, trừ khi ứng dụng của bạn ở mặt trước và đang được sử dụng tích cực. – CommonsWare

Trả lời

0

Tôi gặp khó khăn với cùng một điều khi tôi muốn thiết lập công việc để làm mới một phần nhỏ dữ liệu. Tôi phát hiện ra rằng giải pháp cho vấn đề này có thể được thiết lập công việc một lần nữa với cùng một ID sau khi tôi gọi là jobFinished(JobParameters, boolean). Tôi nghĩ rằng nó sẽ làm việc mỗi lần trên chủ đề chính.

chức năng của tôi để thiết lập công việc trông như thế này:

JobInfo generateRefreshTokenJobInfo(long periodTime){ 
    JobInfo.Builder jobBuilder = new JobInfo.Builder(1L, new ComponentName(mContext, JobService.class)); 
    jobBuilder.setMinimumLatency(periodTime); 
    jobBuilder.setOverrideDeadline((long)(periodTime * 1.05)); 
    jobBuilder.setRequiresDeviceIdle(false); 
    return jobBuilder.build(); 
} 

Khi tôi hoàn thành công việc của tôi sau khi cuộc gọi đầu tiên của công việc tôi gọi trong chủ đề chính

jobFinished(mJobParameters, true); 
registerRefreshJob(5*60*1000L); 

này sẽ sắp xếp lại công việc của tôi thêm một lần nữa trong cùng một khoảng thời gian trên cùng một id. Khi thiết bị ở trạng thái không hoạt động, bạn vẫn phải cân nhắc việc thiếu khóa đánh thức trong doze để công việc của bạn có thể không được khởi động thường xuyên như bạn muốn. Nó được đề cập trong https://developer.android.com/about/versions/nougat/android-7.0-changes.html

Nếu thiết bị đang đứng yên trong một thời gian nhất định sau khi nhập Nữu Thừa, hệ thống áp dụng phần còn lại của các hạn chế Nữu Thừa để PowerManager.WakeLock, báo động AlarmManager, GPS, và quét Wi-Fi. Bất kể một số hoặc tất cả các hạn chế Doze đang được áp dụng, hệ thống sẽ đánh thức thiết bị cho các cửa sổ bảo trì ngắn gọn, trong thời gian đó các ứng dụng được phép truy cập mạng và có thể thực hiện bất kỳ công việc/đồng bộ trì hoãn nào.

+3

Hãy cẩn thận, mặc dù jobcheduler lần trong 1 phút. Nếu tác vụ của bạn mất hơn một phút, 'jobFinished' sẽ không chạy. 'onStopJob' được gọi sau khi hết giờ. Vì vậy, nếu tôi là bạn, tôi cũng sẽ đăng ký lại bên trong 'onStopJob'. – Thupten

+0

giới hạn 1 phút là trên Android 5.1.1 – Thupten

0

Nếu ai đó vẫn đang cố gắng khắc phục tình trạng này,

Đây là một cách giải quyết cho> = Android N (Nếu bạn muốn thiết lập các công việc định kỳ thấp hơn 15 phút) Kiểm tra xem chỉ setMinimumLatency được sử dụng. Ngoài ra, nếu bạn đang chạy một nhiệm vụ mà phải mất một thời gian dài, công việc tiếp theo sẽ được tổ chức tại, hiện tại thời gian VIỆC LÀM Kết thúc + PROVIDED_TIME_INTERVAL

.SetPeriodic (millis dài) hoạt động tốt cho API Cấp dưới Android N

@Override 
public boolean onStartJob(final JobParameters jobParameters) { 
    Log.d(TAG,"Running service now.."); 
    //Small or Long Running task with callback 

    //Reschedule the Service before calling job finished 
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
       scheduleRefresh(); 

    //Call Job Finished 
    jobFinished(jobParameters, false); 

    return true; 
} 

@Override 
public boolean onStopJob(JobParameters jobParameters) { 
    return false; 
} 

private void scheduleRefresh() { 
    JobScheduler mJobScheduler = (JobScheduler)getApplicationContext() 
        .getSystemService(JOB_SCHEDULER_SERVICE); 
    JobInfo.Builder mJobBuilder = 
    new JobInfo.Builder(YOUR_JOB_ID, 
        new ComponentName(getPackageName(), 
        GetSessionService.class.getName())); 

    /* For Android N and Upper Versions */ 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
     mJobBuilder 
       .setMinimumLatency(60*1000) //YOUR_TIME_INTERVAL 
       .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); 
    } 
0

nếu bạn muốn chạy mã định kỳ dưới 15 phút thì bạn có thể sử dụng một cách khôn lanh. Đặt số jobFinished() của bạn như thế này

jobFinished(parameters, true); 

nó sẽ lên lịch lại mã bằng chiến lược thử lại. Xác định tiêu chí backoff tùy chỉnh bằng cách sử dụng

.setBackoffCriteria(); 

trong trình tạo.Sau đó, nó sẽ chạy định kỳ

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