Виджет не обновляется при перезапуске
У меня есть виджет, который будет обновляться каждый раз, когда есть изменение конфигурации (например, ориентация экрана) и всякий раз, когда телефон разблокирован. Этот процесс включает настройку обработчиков onClick
для кнопок на моем виджете. Это хорошо работает, однако я обнаружил, что есть случай использования, из-за которого мое приложение не отвечает на события onClick
. Этот конкретный случай возникает, когда пусковая установка перезапускает себя.
Есть ли способ обнаружить, когда запускается пусковая установка, поэтому я могу обновить свой виджет вручную? Или есть другой способ гарантировать, что обработчики onClick
не будут потеряны?
- Android - Можно ли отключить нажатие кнопки «Домой»
- Как сделать виджет расширяемого / сжимаемого раздела в QT
- Анимация в панели уведомлений Пользовательский вид
- Неправильные координаты из getLocationOnScreen / getLocationInWindow
- Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
- Android: изменение вкладки Цвет текста программно
- Запуск активности из виджета
- Есть ли пример с текстом Spanned и Spannable?
- Есть ли простой способ нанести удар по тексту в виджетах приложения?
- Как отключить элементы в представлении списка?
- Как сделать размер экрана GridLayout подходящим
- Как отобразить два столбца ListView в Android?
- Как сделать меньший рейтингBar?
Оказывается, я 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); } }