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

12
我有一个 Android 小部件,使用 Web 服务检索和展示小部件上的数据。该小部件有一个配置活动,扩展 PreferenceActivity。在安装小部件时,配置活动会立即启动,这是该小部件所需的行为。
问题是,每当添加一个小部件到主屏幕时,小部件都会试图在配置活动启动/完成之前更新自己,这可能导致长时间延迟(几秒钟)。只要添加新的小部件,就应该在小部件尝试更新自身之前发生配置活动。
以下是我在 LogCat 中看到的事件序列,当添加小部件时:
  1. Widget.onRecive: action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: action = APPWIDGET_UPDATE
  4. Widget.onUpdate: Widget Service is started.
  5. WidgetService.onStartCommand: 可能需要长时间运行的工作,将延迟立即显示配置活动。
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: action = APPWIDGET_UPDATE
  8. Widget.onUpdate: 小部件服务再次启动。
  9. WidgetService.onStartCommand: 再次执行可能需要长时间运行的工作。
发生的情况是,当添加小部件时,服务将在配置视图显示之前启动。
<?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>



问题
是否有一种方法可以在系统尝试将小部件添加到主屏幕之前强制显示配置活动?


1
我曾经遇到过类似的问题。在显示配置活动之前,调用update()方法。我找不到改变这种行为的方法。 - mrd
2个回答

19

来自安卓文档: 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方法中。


我也看到在启动配置活动之前调用了ACTION_APPWIDGET_UPDATE。 - scottyab
2
该问题已经在 https://code.google.com/p/android/issues/detail?id=3696 上报。 - Cheok Yan Cheng
这里也报告了类似的错误(不完全相同):https://code.google.com/p/android/issues/detail?id=2539 - Cheok Yan Cheng
2
仍然存在这个问题。 - JackWu
但是 onUpdate 在活动 onCreate 之前被调用。 - Deni Erdyneev
仍然存在问题。 - seekingStillness

-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开发者小部件支持了解详情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接