Виджет не обновляется при перезапуске

У меня есть виджет, который будет обновляться каждый раз, когда есть изменение конфигурации (например, ориентация экрана) и всякий раз, когда телефон разблокирован. Этот процесс включает настройку обработчиков onClick для кнопок на моем виджете. Это хорошо работает, однако я обнаружил, что есть случай использования, из-за которого мое приложение не отвечает на события onClick . Этот конкретный случай возникает, когда пусковая установка перезапускает себя.

Есть ли способ обнаружить, когда запускается пусковая установка, поэтому я могу обновить свой виджет вручную? Или есть другой способ гарантировать, что обработчики onClick не будут потеряны?

Оказывается, я new RemoteViews() когда я должен был просто вызвать его один раз для создания представления, а затем, если потребуется, сослался на этот один экземпляр. В моем решении у меня есть переменная classа, которая хранит этот единственный экземпляр RemoteView и получатель для доступа к нему.

Предложение @Glitch может не работать для определенных случаев, особенно виджета приложений с ListView . Это связано с тем, что ListView будет очень медленным (попробуйте прокрутить ListView ) после того, как appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) был вызван несколько раз.

Я предполагаю, что единственный экземпляр RemoteView сохранит всю свою выполненную команду в списке. С течением времени список инструкций будет расти. Каждый раз, когда appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id) , большой список команд будет выполняться снова и снова.

Мое предложенное решение заключается в следующем. Тем не менее, я считаю, что он будет работать только на определенном устройстве, так как не все устройства получат такое же широковещательное сообщение во время перезапуска пускового устройства.

 @SuppressLint("NewApi") @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) { // http://stackoverflow.com/questions/17396045/how-to-catch-widget-size-changes-on-devices-where-onappwidgetoptionschanged-not handleTouchWiz(context, intent); // Possible launcher restart. handleLauncherRestart(context, intent); } else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) { // Possible launcher restart. handleLauncherRestart(context, intent); } super.onReceive(context, intent); } private void handleLauncherRestart(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); updateAppWidget(context, appWidgetManager, appWidgetId); } private void handleTouchWiz(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra("widgetId", 0); int widgetSpanX = intent.getIntExtra("widgetspanx", 0); int widgetSpanY = intent.getIntExtra("widgetspany", 0); if (appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) { Bundle newOptions = new Bundle(); // We have to convert these numbers for future use // http://stackoverflow.com/questions/10008521/appwidget-size-calculation if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74 - 2); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74 - 2); } else { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 70 - 30); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 70 - 30); } onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } } 
  • ListView с интерактивным / редактируемым виджетами
  • Выделение текста в TextView или WebView
  • Сбой транзакции связывания при динамическом размещении растрового изображения в виджетах
  • Виджет для включения / выключения фонарика камеры в android
  • Как исправить ошибку «процесс - это плохо» для Android-виджета?
  • Как создать пользовательскую кнопку в Android с помощью стилей XML
  • Виджеты не реагируют при повторном добавлении кода
  • Как контролировать ширину и высоту диалогового windows Alert Dial по умолчанию в Android?
  • играть в YouTube в WebView
  • Возможно ли для TextView Marquee в виджетах расширить приложение AppWidgetProvider?
  • как получить html-контент из веб-представления?
  • Давайте будем гением компьютера.