Android Power Screen `Control` 始终采取相同的意图

Android Power Screen `Control` always takes the same intent

我正在与 TheLastProject@github 合作开发一个用作会员卡钱包的应用程序:Catima(link 至 my fork and to app listing

我尝试实施 Power screen cards and I followed the Android development guide on Device Controls

resulting code is (this link 可能在变基期间失效)有问题

@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();
    };
}

代码设计

会员卡由整数标识。我已经根据该整数生成了唯一的控件 ID,以便我可以查询它们。正如维护者告诉我的那样,LoyaltyCardViewActivity 是可用于显示会员卡的视图,意图看起来很真实。

因此,对于输入中的每张卡片,我进行迭代并反应性地 为每张卡片发出一个新的 Control。每个控件都有自己的意图,每个意图都绑定到卡片 ID。

问题

问题是当我长按小部件时,Android发出的意图带有相同的卡ID,这意味着无论我select不同的小部件,相同的(不是那么确定)卡显示。

“不太确定”。当我删除所有控件并再次添加它们时,我无法预测显示的是哪张卡片。但是每次我再次打开电源菜单时,我都会得到相同的卡。

在我调试的 Android 工作室中,我看到传递给 LoyaltyCardViewActivity 的卡 ID 完全相同,尽管当我创建 Control 对象时,我可以清楚地调试意图始终携带不同的 ID

如何重现

适用于模拟器。我使用了一堆真实的会员卡和欧盟数字绿色证书。但是可以通过输入随机数来创建两张或更多条码卡片。

问题

我的代码有什么问题?

PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, openIntent, PendingIntent.FLAG_IMMUTABLE);

您调用了 N 次,所以我猜您希望创建 N 个不同的 PendingIntent 对象。实际上,您只是在创建一个,因为您的 PendingIntent 标识符对它们都是相同的:0.

将其更改为更像:

PendingIntent pendingIntent = PendingIntent.getActivity(this, cardId, openIntent, PendingIntent.FLAG_IMMUTABLE);

(我猜 cardId 对你所有的卡片都是独一无二的)