11

Tôi có một Widget Android sử dụng các dịch vụ web để truy xuất và hiển thị dữ liệu trên widget. Tiện ích con có hoạt động cấu hình extends PreferenceActivity. Hoạt động cấu hình sẽ khởi động ngay khi tiện ích được cài đặt, đó là hành vi mong muốn cho tiện ích con này.Android Widget: Hiển thị hoạt động cấu hình trước khi widget được thêm vào màn hình

Sự cố là, bất cứ khi nào tiện ích được thêm vào màn hình chính, tiện ích sẽ tự cập nhật trước khi hoạt động cấu hình được bắt đầu/hoàn thành, có thể dẫn đến trì hoãn lâu (vài giây). Hoạt động cấu hình sẽ xảy ra trước khi tiện ích cố gắng tự cập nhật bất cứ khi nào một tiện ích con mới được thêm vào.

Đây là chuỗi các sự kiện mà tôi nhìn thấy trong LogCat khi một widget được thêm vào:

  1. Widget.onRecive: action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: hành động = APPWIDGET_UPDATE
  4. Widget.onUpdate: Dịch vụ tiện ích được bắt đầu.
  5. WidgetService.onStartCommand: Tác vụ chạy dài có khả năng sẽ làm chậm hoạt động cấu hình hiển thị ngay lập tức.
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: action = APPWIDGET_UPDATE
  8. Widget.onUpdate: Widget dịch vụ được bắt đầu một lần nữa
  9. WidgetService.onStartCommand: có khả năng dài chạy công việc được thực hiện một lần nữa.

Điều đang xảy ra là khi tiện ích được thêm, dịch vụ sẽ khởi động trước khi chế độ xem cấu hình được hiển thị.

manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xxx.xxx.xxxwidget" 
    android:versionCode="1" 
    android:versionName="@string/app_version" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:debuggable="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver android:name="xxxWidget" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_info" /> 
     </receiver> 

     <activity android:name="xxxWidgetConfigure" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name="xxxWidgetService" /> 
    </application> 

</manifest> 



Câu hỏi
Có cách nào để buộc các hoạt động cấu hình được hiển thị trước khi hệ thống cố gắng để thêm các widget màn hình chủ?

+1

Tôi gặp sự cố quen thuộc. Cuộc gọi đến phương thức update(), xảy ra trước khi hoạt động cấu hình được hiển thị. Tôi không tìm thấy cách nào để thay đổi hành vi này. – mrd

Trả lời

17

Từ tài liệu android: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

Phương pháp này onUpdate() sẽ không được gọi khi Widget App được tạo ra (hệ thống sẽ không gửi broadcast ACTION_APPWIDGET_UPDATE khi một Hoạt động cấu hình được tung ra). Đó là trách nhiệm của hoạt động cấu hình để yêu cầu cập nhật từ AppWidgetManager khi App Widget được tạo đầu tiên. Tuy nhiên, onUpdate() sẽ được gọi cho các bản cập nhật tiếp theo — nó chỉ bị bỏ qua lần đầu tiên.

BAO GIỜ, điều này có vẻ không chính xác!

Điều tôi đã làm là thêm boolean vào SharedPreferences cho tôi biết widgetId này có thông qua cấu hình hay không. Nếu không bỏ qua bản cập nhật này. Thực hiện điều này trong phương thức onUpdate của lớp AppWidgetProvider của bạn.

+0

Tôi cũng thấy ACTION_APPWIDGET_UPDATE được gọi trước khi hoạt động cấu hình được khởi chạy – scottyab

+7

Có vẻ như tài liệu đã lỗi thời và đơn giản là không cập nhật nó .. – Tarantula

+1

Sự cố này được báo cáo trong https://code.google.com/p/ android/issues/detail? id = 3696 –

-1

Khai ActivityConfig trong manifest:

<activity android:name="com.zoostudio.moneylover.widget.ActivityWidgetConfig" android:label="Hello Widget Config"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity>

Với lớp cập nhật phụ tùng:

public abstract class SampleWiget extends AppWidgetProvider { 

}

theo android developer widget support để hiểu nó.

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