Android Widget: показать активность конфигурации до добавления виджета на экран
У меня есть Android-виджет, который использует веб-службы для извлечения и отображения данных в виджетах. Виджет имеет конфигурационную активность, которая extends PreferenceActivity
. Активность конфигурации запускается сразу после установки виджета, что является желаемым поведением для этого виджета.
Проблема заключается в том, что всякий раз, когда виджет добавляется на главный экран, виджет пытается обновить его до того, как будет запущена/завершена работа по настройке, что может привести к длительной задержке (несколько секунд). Активность конфигурации должна произойти до того, как виджет попытается обновить себя в любое время, когда будет добавлен новый виджет.
Вот последовательность событий, которые я вижу в LogCat при добавлении виджета:
- Widget.onRecive: action = APPWIDGET_ENABLED
- Widget.onEnabled
- Widget.onReceive: action = APPWIDGET_UPDATE
- Widget.onUpdate: запущена служба виджета.
- WidgetService.onStartCommand: Потенциально продолжительная работа, которая немедленно отключит активность конфигурации.
- WidgetConfiguration.onCreate
- Widget.onReceive: action = APPWIDGET_UPDATE
- Widget.onUpdate: снова запущена служба виджета
- 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>
Вопрос
Есть ли способ принудительно показать активность конфигурации до того, как система попытается добавить виджет на главный экран?
Ответы
Ответ 1
Из документации по android:
http://developer.android.com/guide/topics/appwidgets/index.html#Configuring
Метод onUpdate() не будет вызываться при создании виджета приложения (система не будет отправлять широковещательную передачу ACTION_APPWIDGET_UPDATE при запуске операции настройки). Задание конфигурации запрашивает обновление из AppWidgetManager при первом создании виджета приложения. Однако onUpdate() будет вызываться для последующих обновлений - он пропускается только в первый раз.
ОДНАКО, это не кажется правильным!
Что я сделал, это добавить логическое значение в SharedPreferences, которое говорит мне, был ли этот widgetId через конфигурацию. Если вы не пропустите это обновление. Внедрите это в свой метод onUpdate класса AppWidgetProvider.
Ответ 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, чтобы понять это.