2015-12-17 13 views
6

प्री एपीआई 1 का उपयोग करके छोटे अंतराल पर एक विजेट अपडेट करना updatePeriodMillis से 30 मिनट के न्यूनतम समय से विजेट को अपडेट करने के लिए जाने-जाने की विधि AlarmManager और BroadcastReceiver का उपयोग करने के बाद इरादे प्राप्त करने के लिए उपयोग करना था अलार्ममेनर सेट अप करते समय अंतराल का उपयोग किया जाता है।एपीआई 1 9 +

वर्तमान में, नीचे दिए गए कोड का उपयोग करके, विजेट अपडेट किया गया है, लेकिन एंड्रॉइड 5.1 के रूप में, .00RMS से कम के दोहराए गए अंतराल के साथ .setRepeating() का उपयोग करके स्वचालित रूप से कम से कम 60000ms पर अंतराल सेट हो जाएगा।

विजेट में अलार्म सेट onEnabled():

AlarmManager am= (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
//After after 3 seconds 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ 3000, 1000 , pi); 
तो AlarmManagerBroadcastReceiver के onReceive() में

:

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG"); 
//Acquire the lock 
wl.acquire(); 

/* 
* ...... 
* Update Widgets RemoteViews 
*/ 

wl.release(); 

डॉक्स में setRepeating() के लिए यह कहते हैं:

नोट: एपीआई 1 9 के रूप में, सभी दोहराने वाले अलार्म अचूक हैं। यदि आपके आवेदन को सटीक डिलीवरी के समय की आवश्यकता है तो उसे ऊपर वर्णित अनुसार प्रत्येक बार पुन: निर्धारित करने के लिए एक बार सटीक अलार्म का उपयोग करना होगा। विरासत अनुप्रयोग जिनके लक्ष्य एसडीकेवर्सन एपीआई 1 से पहले है, उनके अलार्म को दोहराए जाने वाले अलार्म समेत सभी अलार्म जारी रहेगा।

यह भी अब राज्यों:

अनुसूची एक दोहराई जाने वाली अलार्म। नोट: समय के संचालन के लिए (टिक्स, टाइमआउट, आदि) यह आसान और भी बहुत कुछ तो आप एक हैंडलर का उपयोग कर विजेट Remoteviews अपडेट करने के बारे जाना होगा Handler

उपयोग करने के लिए कुशल है? जब बैटरी को बचाने के लिए डिवाइस को सोया जाता है तो आप इसे कैसे रोकेंगे?

क्या कोई विजेट अपडेट करने के लिए कोई अन्य सुझाए गए तरीके हैं?

+0

क्या मेरे उत्तर में कोई समस्या है? या तुमने कोशिश की ? – csenga

उत्तर

2

एपीआई स्तर 21 JobScheduler से इस तरह के आवधिक अद्यतनों को संभालने की अनुशंसा की जाती है।

एक JobService में काम निर्धारित करें:

public class UpdateJob extends JobService { 

    public static int JOB_ID=9; 

    @Override 
    public boolean onStartJob(JobParameters params) { 
     Toast.makeText(getApplicationContext(),"update",Toast.LENGTH_SHORT).show(); 
     //call handler, create thread, asynctask etc 
     return false; 
    } 

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

प्रकट में यह रजिस्टर:

<service android:name=".UpdateJob" 
      android:permission="android.permission.BIND_JOB_SERVICE" /> 

कार्य शेड्यूल ई। जी। एक गतिविधि में:

JobScheduler mJobScheduler = (JobScheduler) 
     getSystemService(Context.JOB_SCHEDULER_SERVICE); 

JobInfo.Builder builder = new JobInfo.Builder(UpdateJob.JOB_ID, 
new ComponentName(getApplicationContext(), UpdateJob.class) ); 

builder.setPeriodic(3000); // in every 3 sec 
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // only when network is available 

if(mJobScheduler.schedule(builder.build()) <= 0) 
{ 
    //error, cant be scheduled 
} 

//later e.g. when update is disabled 
mJobScheduler.cancel(UpdateJob.JOB_ID); 

JobInfo.Builder अनुकूलित करने के लिए बहुत सारे विकल्प है जब अपनी नौकरी उदा शुरू हो रहा है यह नेटवर्क और डिवाइस स्थिति पर निर्भर कर सकता है।

निचले एपीआई JobSchedulerCompat या GCM Network Manager पर इसका विकल्प के रूप में उपयोग किया जा सकता है, वे दोनों ऊपर दिखाए गए जैसा ही काम करते हैं।

+ एक और

एक BroadcastReceiver जो wakelock प्राप्त कर लेता है वहाँ समर्थन लाइब्रेरी, WakefulBroadcastReceiver में एक "सहायक" वर्ग है के साथ काम कर के लिए।

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