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

Posted

技术标签:

【中文标题】Android Widget:在将小部件添加到屏幕之前显示配置活动【英文标题】:Android Widget: Show configuration activity before widget is added to the screen 【发布时间】:2012-02-26 23:49:04 【问题描述】:

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

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

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

    Widget.onRecive:action = APPWIDGET_ENABLED Widget.onEnabled Widget.onReceive:action = APPWIDGET_UPDATE Widget.onUpdate:Widget 服务已启动。 WidgetService.onStartCommand:可能长时间运行的工作会延迟配置活动立即显示。 WidgetConfiguration.onCreate Widget.onReceive:action = APPWIDGET_UPDATE Widget.onUpdate:Widget Service 再次启动 WidgetService.onStartCommand:再次执行可能长时间运行的工作。

发生的情况是,当添加小部件时,服务将在配置视图显示之前启动。

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>

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

【问题讨论】:

我遇到了一个类似的问题。对 update() 方法的调用发生在配置活动显示之前。我发现没有办法改变这种行为。 【参考方案1】:

来自安卓文档: 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 这个问题报告在code.google.com/p/android/issues/detail?id=3696 这里也报告了类似的错误(不完全是):code.google.com/p/android/issues/detail?id=2539 还是有这个问题。 但是onUpdate在活动onCreate之前调用【参考方案2】:

在清单中声明 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了解它。

【讨论】:

以上是关于Android Widget:在将小部件添加到屏幕之前显示配置活动的主要内容,如果未能解决你的问题,请参考以下文章

Android Widget Bundle getString 显示为空

将小部件名称与小部件一起添加到主屏幕

更改通知提供程序以将小部件添加到收藏屏幕

如何有条件地将小部件添加到列表中?

启动配置活动时调用Widget onUpdate

无法动态地将小部件添加到 QScrollArea 对象