Обновление виджета приложения для Android вручную с помощью кнопки на виджете

У меня есть виджет приложения для Android и кнопка на виджете. Я установил период обновления на 30 минут, но я также хочу обновлять виджет всякий раз, когда я касаюсь кнопки. вот мой код:

        RemoteViews remoteV = new RemoteViews(context.getPackageName(), R.layout.widgetmenu);

        Intent intentSync = new Intent(context, MessMenuWidgetProvider.class);
        PendingIntent pendingSync = PendingIntent.getBroadcast(context,0, intentSync,0);
        remoteV.setOnClickPendingIntent(R.id.imageButtonSync,pendingSync);

        appWidgetManager.updateAppWidget(awID, remoteV);

Я установил время обновления на 30 минут, поэтому каждые 30 минут вызывается функция onUpdate(). Чего я хочу добиться, так это вызвать onUpdate() вручную с помощью кнопки. Но этого не происходит. Любая помощь?


person iitum studant    schedule 25.10.2014    source источник
comment
Добро пожаловать в СО. Это не работает, поскольку постановка проблемы действительно недостаточно конкретна, чтобы получить какие-либо ответы. Пожалуйста, отредактируйте свой вопрос, чтобы он был более конкретным.   -  person O. Jones    schedule 26.10.2014


Ответы (4)


Это очень легко. Ниже приведен модифицированный код, который вызывает метод onUpdate вашего виджета при каждом нажатии кнопки.

RemoteViews remoteV = new RemoteViews(context.getPackageName(), R.layout.widgetmenu);

Intent intentSync = new Intent(context, MessMenuWidgetProvider.class);
intentSync.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); //You need to specify the action for the intent. Right now that intent is doing nothing for there is no action to be broadcasted.
PendingIntent pendingSync = PendingIntent.getBroadcast(context,0, intentSync, PendingIntent.FLAG_UPDATE_CURRENT); //You need to specify a proper flag for the intent. Or else the intent will become deleted.
remoteV.setOnClickPendingIntent(R.id.imageButtonSync,pendingSync);

appWidgetManager.updateAppWidget(awID, remoteV);

Теперь каждый раз, когда вы нажимаете эту кнопку, трансляция AppWidgetManager.ACTION_APPWIDGET_UPDATE будет отправляться вашему виджету, и метод, который у вас есть внутри этого класса, будет обрабатывать обновление. Таким образом, либо вызывается метод onUpdate, либо вызывается метод onReceive. Какой бы вы ни указали.

person Seth    schedule 26.10.2014
comment
Он отлично работает, но вызывает onReceive, а не onUpdate. Как изменить его на onUpdate? Спасибо!! - person iitum studant; 26.10.2014
comment
**PendingIntent.FLAG_UPDATE_CURRENT** что это? У меня есть вопрос здесь: stackoverflow.com/questions/40776920/ - person Si8; 24.11.2016
comment
@ Si8 удалите звездочки, я понятия не имею, почему я их туда поставил ... я думаю, что это должно было добавить жирный шрифт к тексту, но этого не произошло. Но это просто флаг для ожидаемого намерения. Он просто обновляет текущее намерение новой информацией. - person Seth; 28.11.2016
comment
Это должен быть тот же ответ на ваш вопрос, который вы связали. Вот как инициировать метод onUpdate или метод onReceive вашего WidgetProvider. - person Seth; 28.11.2016
comment
При использовании этого onReceive вызывается вместо onUpdate. - person stefana; 05.07.2017
comment
Вы также должны сделать intentSync.putExtra( AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { appWidgetId } );, чтобы вызвать onUpdate. Если вы не добавите это дополнение, он вызовет только onReceive, и вам придется обрабатывать его там самостоятельно (а кому это нужно?). - person Ralgha; 16.09.2018

RemoteViews remoteV = new RemoteViews(context.getPackageName(), R.layout.widgetmenu);

Intent intentSync = new Intent(context, MessMenuWidgetProvider.class);
intentSync.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
PendingIntent pendingSync = PendingIntent.getBroadcast(context,0, intentSync, PendingIntent.FLAG_UPDATE_CURRENT); 
remoteV.setOnClickPendingIntent(R.id.imageButtonSync,pendingSync);

appWidgetManager.updateAppWidget(awID, remoteV);

Он вызовет onReceive(); В вашем методе onReceive() просто добавьте следующее, чтобы вызвать onUpdate вручную.

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    super.onReceive(context, intent);

    Bundle extras = intent.getExtras();
       if(extras!=null) {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        ComponentName thisAppWidget = new ComponentName(context.getPackageName(), MessMenuWidgetProvider.class.getName());
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);

        onUpdate(context, appWidgetManager, appWidgetIds);
       }
}
person iitum studant    schedule 26.10.2014
comment
Я тестирую этот код... с моим кодом (stackoverflow.com/questions/40776920/) Я дам вам знать, как это происходит. - person Si8; 24.11.2016
comment
Ничего не сделал :/ - person Si8; 24.11.2016

Если MessMenuWidgetProvider является вашим подклассом AppWidgetProvider, ваш PendingIntent вызовет для него onReceive(), а не onUpdate(). Вам нужно будет позвонить setAction() на Intent, поставляющий ACTION_APPWIDGET_UPDATE, плюс заполните дополнение EXTRA_APPWIDGET_IDS идентификатором виджета вашего приложения в один аргумент int[]. Другими словами, вам нужно настроить Intent таким же образом, как и структуру Intent, которую AppWidgetManager будет использовать для запуска onUpdate() в вашем AppWidgetProvider.

person CommonsWare    schedule 25.10.2014
comment
Пожалуйста, помогите с моим вопросом: stackoverflow.com/questions/40776920/ - person Si8; 24.11.2016

В коде onUpdate() поставщика виджета приложения добавьте следующее к намерению предоставить идентификатор виджета:

intentSync.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);

В действии App Widget Configure убедитесь, что вы получили идентификатор виджета:

int awID = AppWidgetManager.INVALID_APPWIDGET_ID;

 // Find the widget id from the intent. 
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        if (extras != null) {
            awID = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID,  AppWidgetManager.INVALID_APPWIDGET_ID);
        }

    // If we got intent without the widget id, exit.
    if (awID == AppWidgetManager.INVALID_APPWIDGET_ID) {
        finish();
    }

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

Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
setResult(RESULT_OK, resultValue); 
person Wildroid    schedule 25.10.2014