Android Power Screen `Control` всегда преследует одни и те же цели
Я сотрудничаю с TheLastProject @github над приложением, которое работает как кошелек для карты лояльности: Catima (ссылка на мою вилку и на список приложений )
Я попытался реализовать карты Power screen и следовал руководству по разработке Android по элементам управления устройствами.
В результирующем коде (эта ссылка может стать недействительной во время перебазирования) есть проблемы
@NonNull
@Override
public Flow.Publisher<Control> createPublisherFor(@NonNull List<String> controlIds) {
return subscriber -> {
subscriber.onSubscribe(new NoOpSubscription());
for (String controlId : controlIds) {
Integer cardId = this.controlIdToCardId(controlId);
if (cardId == null)
continue;
LoyaltyCard card = dbHelper.getLoyaltyCard(cardId);
Intent openIntent = new Intent(this, LoyaltyCardViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("id", card.id);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, openIntent, PendingIntent.FLAG_IMMUTABLE);
var ret = new Control.StatefulBuilder(controlId, pendingIntent)
.setTitle(card.store)
.setDeviceType(DeviceTypes.TYPE_GENERIC_OPEN_CLOSE)
.setSubtitle(card.note)
.setStatus(Control.STATUS_OK)
.setControlTemplate(new StatelessTemplate(controlId))
.setCustomIcon(Icon.createWithBitmap(Utils.generateIcon(this, card.store, card.headerColor).getLetterTile()))
.build();
Log.d(TAG, "Dispatching widget " + controlId);
subscriber.onNext(ret);
}
subscriber.onComplete();
};
}
Дизайн кода
Карты лояльности обозначаются целым числом. Я создал уникальные идентификаторы элементов управления на основе этого целого числа, чтобы я мог запрашивать их. Как сказал мне специалист по обслуживанию, это представление, которое можно использовать для отображения карты лояльности, и намерение выглядит искренним.
Поэтому для каждой карты во входных данных я повторяю и реактивно генерирую новую для каждой карты. Каждый элемент управления имеет собственное намерение, и каждое намерение привязано к идентификатору карты.
Проблема
Проблема в том, что когда я долго нажимаю на виджет, намерение, испускаемое Android, имеет тот же идентификатор карты, что означает, что независимо от того, выбираю я разные виджеты, отображается одна и та же (не столь детерминированная) карта.
«Не такой уж детерминированный». Когда я удаляю все элементы управления и добавляю их снова, я не могу предсказать, какая карточка отображается. Но каждый раз, когда я снова открываю меню питания, я получаю ту же карту.
В студии Android я отлаживал и вижу, что тот же идентификатор карты передан в
LoyaltyCardViewActivity
, несмотря на то, что когда я создаю
Control
объект, который я могу четко отладить, что намерение всегда имеет другой идентификатор
Как воспроизвести
Работает на эмуляторе. Я использовал кучу настоящих карт лояльности и цифровой зеленый сертификат ЕС. Но можно создать две или более карт со штрих-кодом, введя случайные числа.
Вопрос
Что не так с моим кодом?
1 ответ
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, openIntent, PendingIntent.FLAG_IMMUTABLE);
Вы вызываете это N раз, и я предполагаю, что вы ожидаете, что создаете N различных объектов. На самом деле вы создаете только один, потому что ваш
PendingIntent
идентификатор у всех одинаковый:
0
.
Измените это на что-то вроде:
PendingIntent pendingIntent = PendingIntent.getActivity(this, cardId, openIntent, PendingIntent.FLAG_IMMUTABLE);
(Я предполагаю, что
cardId
уникальна для всех ваших карт)