setData для намерений RemoteViewService - PullRequest
0 голосов
/ 29 июня 2018

Какая польза от

serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

для следующих Intent в классе AppWidgetProvider (см. Код ниже)

Согласно книге CommonsWare причина:

Пока у вашего приложения есть доступ к вашему объекту класса RemoteViewsService, у хоста виджета приложения нет, и поэтому нам нужно что-то, что будет работать через границы процесса. Вы можете добавить свой собственный в RemoteViewsService и использовать Intent, основанный на этом, но это сделает ваш сервис более публичным, чем вы хотели бы.

Источник: Руководство занятого кодера по разработке Android https://commonsware.com/Android/

Но когда я удаляю эту строку, ничего не меняется. Виджет все еще работает.

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int appWidgetId : appWidgetIds) {

        [...]

        Intent serviceIntent = new Intent(context, WidgetService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));

        views.setRemoteAdapter(R.id.stack_view, serviceIntent);
        views.setEmptyView(R.id.stack_view, R.id.empty_view);

        [...]

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

1 Ответ

0 голосов
/ 02 июля 2018

Я понял это. Если вы не используете setData, система не сможет различить разные сервисные намерения, из-за чего она будет вызывать onGetViewFactory только один раз для нескольких виджетов и отправлять одно и то же намерение всем им. Если вы, например, отправите идентификатор виджета приложения на ваш RemoteViewsService и от их на ваш RemoteViewsFactory и отобразите его в каждом элементе, он будет отображать один и тот же идентификатор для всех экземпляров виджета, если вы не используете setData.

...