Предотвратить запуск onUpdate WidgetProvider

Я реализую виджет, который имеет ConfigurationActivity и должен оставаться совместимым с Eclair (2.1).

В документации по методу AppUidgetProviders onUpdate четко указано, что:

…. Однако, если вы объявили конфигурационную активность, этот метод не вызывается, когда пользователь добавляет виджет App, но вызывается для последующих обновлений. Задание конфигурации выполняет первое обновление при выполнении конфигурации. (См. Создание действия по настройке виджета приложения ниже.)

К сожалению, это неверно (по крайней мере, для моего Nexus S с JellyBean). В onUpdate перед onCreate моих триггеров ConfigurationActivity. Я хочу знать, есть ли подобное поведение на других телефонах, и если можно предотвратить вызов onUpdate внутри моего провайдера?

Мое обходное решение – хранить флаг в SharedPreferences внутри моей WidgetConfigurationActivity с этим конкретным AppWidgetId. Если его нет, я могу предположить, что ConfigurationActivity не был вызван первым. Это работает, но в моей точке зрения действительно ужасно. Если я не могу предотвратить onUpdate от запуска, есть ли лучшее решение?

Да, onUpdate () вызывается при добавлении виджета на рабочий стол. Глянь сюда:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#ACTION_APPWIDGET_UPDATE

Я не уверен, есть ли способ не запускать его при создании виджета. Но вы можете остановить его от запуска снова, установив поле «updatePeriodMillis» в XML-файле Widget Info в 0 или просто оставив его пустым .

Другой способ – хранить идентификаторы виджетов где-нибудь. Теперь, когда новый виджет добавлен, в вашем классе Receiver проверьте, существует ли идентификатор или нет. Если он не существует (что означает новый виджет), тогда не выполняйте никакого кода. Кроме того, удалите идентификатор виджетов из своих записей всякий раз, когда виджет будет удален. Так как есть вероятность, что вы удалили виджет, а затем добавили новый виджет с тем же идентификатором, что и старый.

Надеюсь, это поможет!

EDIT: в методе onReceive () в вашем классе Receiver сделайте следующее:

 public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID ) { super.onReceive(context, intent); } } 

Когда виджет сначала выбирается из списка виджетов, его приложение appWidgetId будет равно INVALID_APPWIDGET_ID, пока оно не будет добавлено на начальном экране. Поскольку «super.onReceive ()» вызывает метод onUpdate () при выборе виджета, onUpdate () не будет вызываться в первый раз.

У меня тоже есть эта ошибка.

Даже я установил updatePeriodMillis равным 0. Мой onUpdate работает до того, как я запустил настройку активности Widget. Я думаю, что это ошибка в виджетах Android.

Я решил эту проблему, добавив действие к намерению в onUpdate, затем установив if check onReceive, чтобы увидеть, был ли щелкнут виджет:

Я добавил intentClick.setAction(WIDGET_CLICKED); Который запускается только при нажатии на виджет.

 public class WidgetProvider extends AppWidgetProvider { private static final String TAG = WidgetProvider.class.getSimpleName(); private static String WIDGET_CLICKED = "widget_clicked"; public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.e(TAG, "onUpdate()"); remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); watchWidget = new ComponentName(context, WidgetProvider.class); Intent intentClick = new Intent(context, WidgetProvider.class); intentClick.setAction(WIDGET_CLICKED); intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, "" + appWidgetIds[0]); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0], intentClick, 0); remoteViews.setOnClickPendingIntent(R.id.img_btn, pendingIntent); remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Log.e(TAG, "onReceive()"); Bundle extras = intent.getExtras(); //If AND ONLY IF WIDGET_CLICKED if (extras != null && intent.getAction().equals(WIDGET_CLICKED)) { remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); //If isPlaying if (isPlaying) { //setBackground as PLAY remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); isPlaying = false; Intent i = new Intent(context, MediaPlayerService.class); i.putExtra("command", "stopSong"); context.startService(i); //If NOT playing } else { //setBackground as STOP remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.stop); isPlaying = true; Intent i = new Intent(context, MediaPlayerService.class); i.putExtra("command", "playRandomSong"); context.startService(i); } watchWidget = new ComponentName(context, WidgetProvider.class); (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews); } } 
Intereting Posts
Android – завершение деятельности другой деятельности Android Как добавить значок в каждый элемент списка listvIew и изменить цвет текста, цвет фона Анимация пунктов меню в ActionBar «Контент-провайдер не найден для отзыва разрешения: файл: /// data / local в приложении sencha touch Включая услуги Google Play для Android Studio Android Gradle заменить имя пакета для значения в манифесте Использование предварительно построенных библиотек и jni в Android Studio Не удалось найти модуль с дорожкой Gradle. Вместо ссылки на библиотеку Доступ к данным из файла proc в модуле ядра ContentObserver onChange () повторяется несколько раз Зачем мне так часто перезаписывать ADB в Eclipse, чтобы подключиться к Android-устройству? Игровое программирование iphone osx android 1.6 shared codebase Android-вкладки в фрагменте с рушащейся панелью инструментов Намерение открыть настройки Wi-Fi Direct Плагин Android для Eclipse (ADT) исчезает после обновления SDK 20