2010-05-28 29 views
15

Tôi hiện đang tìm hiểu về các tiện ích trong Android.Làm thế nào để cập nhật một Widget động (Không phải chờ 30 phút để onUpdate được gọi)?

Tôi muốn tạo tiện ích WIFI sẽ hiển thị SSID, mức RSSI (Tín hiệu).

Nhưng tôi cũng muốn có thể gửi dữ liệu từ dịch vụ mà tôi đang chạy để tính Chất lượng âm thanh qua wifi.

Dưới đây là những gì tôi có sau khi một số đọc và hướng dẫn nhanh:


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

} 

dường như ở trên để làm việc ok, nó cập nhật các SSID trên widget mỗi 10 giây.

Tuy nhiên cách hiệu quả nhất để nhận thông tin từ dịch vụ của tôi sẽ chạy để cập nhật định kỳ trên tiện ích của tôi là gì?

Ngoài ra, có cách tiếp cận tốt hơn để cập nhật tiện ích thay vì sử dụng bộ hẹn giờ và tính thời gian không? (Tránh bỏ phiếu)

CẬP NHẬT

Theo đề nghị của Karan của tôi đã thêm đoạn mã sau vào dịch vụ của tôi:


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

này được chạy mỗi khi thay đổi mức RSSI nhưng nó vẫn chưa bao giờ cập nhật TextView trên widget của tôi, bất kỳ ý tưởng nào tại sao?

EDIT

Got nó làm việc, nhờ Karan

+0

Đây là giải pháp của tôi, cách tự động cập nhật tiện ích thường xuyên hơn 30 phút. Tôi sử dụng AlarmManager: http://stackoverflow.com/questions/5476867/updating-app-widget-using-alarmmanager/#answer-14319020 – petrnohejl

Trả lời

23

Bạn có thể sử dụng mã sau để cập nhật dữ liệu của tiện ích con:

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

Tôi có thể đặt điều đó trong dịch vụ của mình và nó sẽ cập nhật Tiện ích động? –

+0

Không, đây là mã bạn sử dụng để kích hoạt cập nhật (tôi đã sử dụng 4 dòng ở trên ở cuối câu hỏi). Tôi đã làm điều này bằng cách thêm mục đích đang chờ xử lý vào nút làm mới trên tiện ích của tôi. Khi được nhấn, ý định đó đã kích hoạt một chương trình phát sóng cho một hành động tùy chỉnh. Tôi bắt gặp hành động này trong phương thức onReceive trong WidgetProvider của tôi và sau đó thực thi mã này. Hoạt động tuyệt vời! Cảm ơn! – RealCasually

1

Nếu bạn nhìn vào documentation about widgets, bạn có nghĩa vụ phải có khả năng thiết lập một thời gian giữa 2 cập nhật:

<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" > 

Với điều này, bạn sẽ có thể đặt bất kỳ khoảng thời gian nào bạn muốn? (Nó đề cập rằng bản cập nhật có thể không xảy ra trực tiếp sau khi bạn gọi cho nó, và do đó phải làm điều đó thường xuyên nhất có thể nhưng bạn phải chăm sóc pin)

+6

Từ 1.6 bản cập nhật tối thiểu mà hệ điều hành sẽ cho phép và thực hiện là 30 phút khởi động để tiết kiệm pin . Tôi cần cập nhật Widget mỗi khi mức RSSI thay đổi đáng kể, điểm truy cập Wifi thay đổi và khi QoS tính từ dịch vụ của tôi giảm xuống dưới hoặc trèo lên trên một mức nhất định. Tất cả đều cần cập nhật động trên Widget. –

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