2010-05-28 7 views
15

मैं वर्तमान में एंड्रॉइड में विजेट्स के बारे में सीख रहा हूं।गतिशील रूप से विजेट को कैसे अपडेट करें (अद्यतन करने के लिए 30 मिनट का इंतजार नहीं कर रहा है)?

मैं एक वाईफ़ाई विजेट बनाना चाहता हूं जो एसएसआईडी, आरएसएसआई (सिग्नल) स्तर प्रदर्शित करेगा।

लेकिन मैं यह भी एक सेवा से डेटा भेजने में सक्षम होना चाहता हूं जो मैं चल रहा हूं जो वाईफ़ाई पर ध्वनि की गुणवत्ता की गणना करता है। यह विजेट हर 10 सेकंड पर SSID अद्यतन करता है,


public class WlanWidget extends AppWidgetProvider{ 

RemoteViews remoteViews; 
AppWidgetManager appWidgetManager; 
ComponentName thisWidget; 
WifiManager wifiManager; 

public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new WlanTimer(context, appWidgetManager), 1, 10000); 

} 


private class WlanTimer extends TimerTask{ 

     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 


public WlanTimer(Context context, AppWidgetManager appWidgetManager) { 

     this.appWidgetManager = appWidgetManager; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
     thisWidget = new ComponentName(context, WlanWidget.class); 
     wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 


} 

@Override 
public void run() { 

     remoteViews.setTextViewText(R.id.widget_textview, 
     wifiManager.getConnectionInfo().getSSID()); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
} 

} 

ऊपर ठीक से काम करने लगता है:

यहाँ मैं कुछ पढ़ने और एक त्वरित ट्यूटोरियल के बाद है।

हालांकि मेरी सेवा से जानकारी प्राप्त करने का सबसे प्रभावशाली तरीका क्या है जो मेरे विजेट पर समय-समय पर अपडेट करने के लिए पहले से चल रहा है?

टाइमर और टाइमर्टस्क का उपयोग करने के बजाय विजेट को अपडेट करने के लिए भी एक बेहतर तरीका है? (मतदान करने से बचें)

अद्यतन

करन के सुझाव के अनुसार मैं अपने सेवा में निम्न कोड जोड़ लिया है:


RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
ComponentName thisWidget = new ComponentName(context, WlanWidget.class); 
remoteViews.setTextViewText(R.id.widget_QCLevel, " " + qcPercentage); 
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, remoteViews); 

यह हर चलाने हो जाता है RSSI स्तर परिवर्तन लेकिन यह अभी भी मेरे विजेट पर टेक्स्टव्यू अपडेट नहीं करता है, किसी भी विचार क्यों?

संपादित

यह, काम मिल गया धन्यवाद करण

+0

यह मेरा समाधान है, 30 मिनट से अधिक बार विजेट को स्वचालित रूप से कैसे अपडेट करें। मैं अलार्ममेनगर का उपयोग करता हूं: http://stackoverflow.com/questions/5476867/updating-app-widget-using-alarmmanager/#answer-14319020 – petrnohejl

उत्तर

23

आप डेटा को अद्यतन करने के लिए निम्न कोड का उपयोग कर सकते विजेट का:

ComponentName thisWidget = new ComponentName(getContext(), <ProviderClass>); 
AppWidgetManager.getInstance(getContext()).updateAppWidget(thisWidget, rempoteViews);
+0

मैं इसे अपनी सेवा में डाल सकता हूं और यह गतिशील रूप से विजेट अपडेट करेगा? –

+0

नहीं, यह वह कोड है जिसका उपयोग आप अद्यतन को ट्रिगर करने के लिए करते हैं (मैंने प्रश्न के अंत में उपरोक्त 4 पंक्तियों का उपयोग किया था)। मैंने अपने विजेट पर रीफ्रेश बटन पर लंबित इरादा जोड़कर ऐसा किया। दबाए जाने पर, उस इरादे ने एक कस्टम कार्रवाई के लिए प्रसारण निकाल दिया। मैंने इस क्रिया को मेरे विजेटप्रोवाइडर में ऑनसेसिव विधि में पकड़ा और फिर इस कोड को निष्पादित किया। बहुत अच्छा काम करता है! धन्यवाद! – RealCasually

1

आप documentation about widgets को देखें, तो आप 2 अद्यतन के बीच एक समय निर्धारित करने में सक्षम होने की अपेक्षा की जाती है:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="294dp" 
android:minHeight="72dp" 
android:updatePeriodMillis="86400000" 
android:initialLayout="@layout/example_appwidget" 
android:configure="com.example.android.ExampleAppWidgetConfigure" > 

इसके साथ, आप अपनी इच्छित अवधि को रखने में सक्षम होना चाहिए? (यह कहा गया है कि अद्यतन इसके लिए अपने कॉल के बाद सीधे उत्पन्न नहीं हो सकता है, और यह जितनी बार संभव करने के लिए henceforce लेकिन आप बैटरी की देखभाल करने के लिए है)

+6

1.6 से न्यूनतम अपडेट ओएस की अनुमति होगी और बैटरी जीवन बचाने के लिए 30 मिनट का एपर्ट होगा । मुझे आरएसएसआई स्तर में महत्वपूर्ण परिवर्तन होने पर हर बार विजेट को अपडेट करने में सक्षम होना चाहिए, वाईफ़ाई एक्सेस पॉइंट बदलता है और जब मेरी सेवा से गणना की गई क्यूओएस नीचे आती है या एक निश्चित स्तर से ऊपर चढ़ती है। जिनमें से सभी को विजेट पर गतिशील अद्यतन की आवश्यकता है। –

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