Android小部件:在小部件添加到屏幕之前显示配置活动

时间:2012-02-04 20:28:19

标签: android android-widget android-manifest sharedpreferences android-preferences

我有一个Android Widget,它使用Web服务来检索和显示窗口小部件上的数据。窗口小部件的配置活动为extends PreferenceActivity。安装窗口小部件后,配置活动就会立即启动,这是此窗口小部件的所需行为。

问题是,无论何时将小部件添加到主屏幕,小部件都会在配置活动开始/完成之前尝试更新自身,这可能会导致长时间延迟(几秒钟)。配置活动应在小部件尝试在添加新小部件时自行更新之前发生。

以下是添加窗口小部件时我在LogCat中看到的事件序列:

  1. Widget.onRecive:action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive:action = APPWIDGET_UPDATE
  4. Widget.onUpdate:小部件服务已启动。
  5. WidgetService.onStartCommand:潜在的长时间运行工作会导致配置活动无法立即显示。
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive:action = APPWIDGET_UPDATE
  8. Widget.onUpdate:小部件服务再次启动
  9. WidgetService.onStartCommand:可能会再次执行长时间的工作。
  10. 发生的事情是,添加窗口小部件后,服务将在显示配置视图之前启动。

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



    问题
    有没有办法在系统尝试将小部件添加到主屏幕之前强制显示配置活动?

2 个答案:

答案 0 :(得分:18)

来自android文档: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

  

创建App Widget时不会调用onUpdate()方法(系统在启动配置Activity时不会发送ACTION_APPWIDGET_UPDATE广播)。首次创建App Widget时,配置Activity负责从AppWidgetManager请求更新。但是,onUpdate()将被调用以用于后续更新 - 它仅在第一次被跳过。

但是,这似乎不正确!

我所做的是向SharedPreferences添加一个布尔值,告诉我这个widgetId是否已通过配置。如果没有跳过此更新。在AppWidgetProvider类'onUpdate方法中实现它。

答案 1 :(得分:-1)

在清单中声明ActivityConfig:

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

使用更新小部件类:

public abstract class SampleWiget extends AppWidgetProvider {

}

按照android developer widget support了解它。