2016-09-22 9 views
7

मेरे प्रश्न का एक हिस्सा, मैं "नौगेट" में 15 मिनट के अंतराल के साथ नौकरी कैसे स्थापित कर सकता हूं, उसका उत्तर यहां "ब्लिज़र्ड" द्वारा उत्तर दिया गया था:
Job Scheduler not running on Android N
उन्होंने समस्या के बारे में बताया और निम्नलिखित तरीके का उपयोग करने का सुझाव दिया:एंड्रॉइड एन में नौकरी शेड्यूलर कम से कम 15 मिनट अंतराल

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

हालांकि, का उपयोग करते हुए सुझाव दिया

.setMinimumLatency(REFRESH_INTERVAL)  

सिर्फ काम एक बार शुरू होता है;
लेकिन मैं एंड्रॉइड नौगेट डिवाइस (हैंडलर या अलार्म मैनेजर का उपयोग नहीं कर रहा) पर लगभग 30 सेकंड की अवधि के साथ आवधिक कैसे प्राप्त करूं?

+2

प्रत्येक 30 सेकंड में कुछ करने के अलावा, जब आपका ऐप अग्रभूमि में होता है और उपयोगकर्ता द्वारा सक्रिय रूप से उपयोग किया जाता है, तो उपयोगकर्ताओं की आंखों में अनुचित है, जिन्होंने पृष्ठभूमि ऐप्स द्वारा बैटरी खपत के बारे में जोर से शिकायत की है। – CommonsWare

+0

हालांकि, यदि आपके पास ऐसे उपयोगकर्ता हैं जो नवीनतम फोन उपलब्ध करते हैं तो वे अपने फोन को शुरू करते हैं (शायद वे इंटरनेट के बिना हैं ...), किसी को एक विश्वसनीय पृष्ठभूमि सेवा की आवश्यकता होती है। या आप मुझे बताने की कोशिश कर रहे हैं, कि यह सिर्फ स्पष्ट रूप से संभव नहीं है? तो आप मुझे उन चीजों के बारे में सिखाने की कोशिश किए बिना ऐसा कर सकते हैं। – tomseitz

+1

"यदि आपके पास ऐसे उपयोगकर्ता हैं जो नवीनतम फोन उपलब्ध करते हैं तो वे अपने फोन को शुरू करते हैं" - हर 30 सेकंड में काम करने की आवश्यकता नहीं होती है। "या आप मुझे बताने की कोशिश कर रहे हैं, कि यह सिर्फ स्पष्ट रूप से संभव नहीं है?" - ऐसा कुछ भी नहीं है जो इस भरोसेमंद तरीके से करेगा, जब तक कि आपका ऐप अग्रभूमि में न हो और सक्रिय रूप से उपयोग किया जा रहा हो। प्रलेखन के अनुसार – CommonsWare

उत्तर

0

मैं उसी चीज से संघर्ष कर रहा था जब मैं डेटा के छोटे हिस्से को ताज़ा करने के लिए नौकरी सेट करना चाहता था। मुझे पता चला कि इस समस्या का समाधान jobFinished(JobParameters, boolean) कहलाए जाने के बाद एक ही आईडी के साथ नौकरी स्थापित कर सकता है। मुझे लगता है कि इसे हर समय मुख्य धागे पर काम करना चाहिए।

सेटअप नौकरी मेरे समारोह इस तरह दिखता है:

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

जब मैं नौकरी की पहली कॉल के बाद मेरा काम खत्म हो मैं मुख्य थ्रेड में फोन

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

यह मेरी नौकरी एक बार फिर से शेड्यूल होगा एक ही आईडी पर एक ही समय के लिए। जब डिवाइस निष्क्रिय स्थिति में होता है तो आपको अभी भी डोज़ में जागने वाले ताले की कमी को ध्यान में रखना होगा ताकि आपकी नौकरी इतनी बार शुरू नहीं हो सके जितनी आप चाहें। यह https://developer.android.com/about/versions/nougat/android-7.0-changes.html

डिवाइस खपत के प्रवेश करने के बाद एक निश्चित समय के लिए स्थिर है में उल्लेख किया है, प्रणाली PowerManager.WakeLock, AlarmManager अलार्म, जीपीएस, और वाई-फाई स्कैन करने के लिए खपत के प्रतिबंध के बाकी लागू होता है। भले ही कुछ या सभी Doze प्रतिबंध लागू किए जा रहे हों, सिस्टम संक्षिप्त रखरखाव विंडो के लिए डिवाइस को जगाता है, जिसके दौरान अनुप्रयोगों को नेटवर्क पहुंच की अनुमति है और किसी भी स्थगित नौकरियों/syncs निष्पादित कर सकते हैं।

+3

हालांकि सावधान रहें, नौकरियों के समय 1 मिनट में बाहर निकलें। यदि आपका कार्य एक मिनट से अधिक समय लेता है, तो 'jobFinished' नहीं चलेंगे। 'ऑनस्टॉप जॉब' को टाइमआउट के बाद बुलाया जाता है। तो अगर मैं आप थे, तो मैं 'ऑनस्टॉप जॉब' के अंदर भी पुनः पंजीकरण करूँगा। – Thupten

+0

1 मिनट की सीमा एंड्रॉइड 5.1.1 पर है – Thupten

0

कोई अभी भी स्थिति पर काबू पाने के लिए कोशिश कर रहा है, तो

यहाँ> = एंड्रॉयड एन के लिए एक समाधान नहीं है की जाँच करें कि केवल setMinimumLatency प्रयोग किया जाता है (यदि आप समय-समय पर काम 15 मिनट से कम सेट करना चाहते हैं)। इसके अलावा, आप एक काम है कि एक लंबा समय लगता चला रहे हैं, अगले काम में मौजूदा नौकरी समाप्त समय + PROVIDED_TIME_INTERVAL

.SetPeriodic (लंबी मिली सेकंड), शेड्यूल कर दिया जाएगा नीचे एंड्रॉयड एन

@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

यदि आप समय-समय पर 15 मिनट से कम कोड चलाने के लिए चाहते हैं तो आप एक मुश्किल तरीके का उपयोग कर सकते हैं। सेट अपने jobFinished() इस

jobFinished(parameters, true); 

है जैसे कि यह एक पुनः प्रयास रणनीति के साथ कोड को पुनर्निर्धारित होगा।

.setBackoffCriteria(); 

का उपयोग कर कस्टम बैकऑफ मानदंडों को परिभाषित करें।फिर यह समय-समय पर

संबंधित मुद्दे