Время жизни виджета приложения для Android

У меня проблема с моим виджетом приложения. Я создал виджет приложения с 6 кнопками, я объединяю эти 6 кнопок с 6 действиями (в манифесте и в методе onUpdate()). Потому что, если пользователь нажмет одну из них, я смогу отреагировать на это. Но по прошествии времени по умолчанию я не получил ответ, похоже, appwidgetmanager не работает.

Проблема в том, что если я подключаю устройство к компьютеру, оно работает, например. 1 неделю, но когда я использую смартфон обычным способом (я не подключал его к компьютеру, я использую его целый день), в конце дня приложение не отвечает, кнопки не реагируют.

Виджет должен отображать только некоторый текст, по этой причине я отключаю период обновления -> приложение запускается только один раз в методе onUpdate().

Теперь вопрос: Должен ли я реализовать период обновления, чтобы я мог подтвердить, что appwidget все еще живет в конце дня или это другая проблема / проблема?

С уважением Ману

2 ответа

Решение

Рекомендуется установить updatePeriodMillis примерно в 900000 миллисекунд. Это будет вызывать ваш метод onUpdate каждые 15 минут. В методе onUpdate вы можете "обновить" ожидающие намерения для ваших удаленных представлений. Другая вещь, которую вы можете сделать, это выполнять обновление виджетов каждый раз, когда вы меняете свои удаленные представления. Например, пользователь нажимает кнопку, делает то, что вам нужно, а затем выполняет обновление виджета.

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

Мое исследование показывает, что 15 минут - это хорошее время для этого. Например, это мой метод onUpdate, который запускается каждые 15 минут для виджета со многими кнопками:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d(TAG, "onUpdate");
    super.onUpdate(context, appWidgetManager, appWidgetIds);

    FullWidgetPreferencesHelper wp;

    // If no specific widgets requested, collect list of all
    if (appWidgetIds == null) {
        appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, FullWidgetProvider.class));
    }

    for (int widgetId : appWidgetIds) {
        Commands.FullWidgetUpdate(context, widgetId, 0); //<-- Update το widgetId
    }
}

и метод FullWidgetUpdate выглядит примерно так:

...
    views.setInt(R.id.cmdwifi, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topleft_black));
    views.setInt(R.id.cmdbluetooth, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmddata, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdsync, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdflight, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdgps, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdorientation, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdvolume, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topright_black));
...
        final int PendingIntentFLAG = PendingIntent.FLAG_UPDATE_CURRENT;

    Intent iWiFi = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdwifi).setData(Uri.parse("custom:" + widgetID));
    PendingIntent piWiFi = PendingIntent.getBroadcast(cx, 0, iWiFi, PendingIntentFLAG);
    views.setOnClickPendingIntent(R.id.cmdwifi, piWiFi);

    Intent iBT = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdbt).setData(Uri.parse("custom:" + widgetID));
    PendingIntent piBT = PendingIntent.getBroadcast(cx, 0, iBT, PendingIntentFLAG);
    views.setOnClickPendingIntent(R.id.cmdbluetooth, piBT);
... and so on for other buttons ....

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

Обновляете ли вы каждое представление в виджете каждый раз, когда обновляете одно из представлений?

В прошлый раз, когда я проверял, вам приходилось обновлять каждое представление каждый раз, иначе представления рано или поздно перестанут отвечать на запросы. Другими словами, если у вас есть 6 кнопок и 2 текстовых представления, и вы хотите обновить одно из текстовых представлений, вам также необходимо обновить другое текстовое представление и кнопки (с той же информацией, которую вы отправили им ранее, конечно).

Это может быть или не быть ошибкой в ​​Android, но это так и есть.

Другие вопросы по тегам