Android Power Screen `Control` 总是采用相同的意图
Posted
技术标签:
【中文标题】Android Power Screen `Control` 总是采用相同的意图【英文标题】:Android Power Screen `Control` always takes the same intent 【发布时间】:2021-11-26 15:20:13 【问题描述】:我正在与 TheLastProject@github 合作开发一款可用作会员卡钱包的应用:Catima(链接至 my fork 和 app listing)
我尝试实现Power screen cards 并遵循Device Controls 上的android 开发指南
resulting code 是(这个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发出的intent带有相同的卡片ID,这意味着无论我选择不同的小部件,都会显示相同的(不是那么确定的)卡片。
“不是那么确定”。当我删除所有控件并再次添加它们时,我无法预测显示的是哪张卡片。但每次我再次打开电源菜单时,我都会得到同一张卡片。
在我调试的 Android 工作室中,我看到传递给 LoyaltyCardViewActivity
的卡 ID 完全相同,尽管当我创建 Control
对象时,我可以清楚地调试意图始终携带不同的 ID
如何重现
在模拟器上工作。我使用了一堆真正的会员卡和欧盟数字绿色证书。但是可以通过输入随机数来创建两张或更多条码卡。
问题
我的代码有什么问题?
【问题讨论】:
【参考方案1】: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
对于你所有的卡片都是独一无二的)
【讨论】:
我认为它会起作用:***.com/questions/21526319/…以上是关于Android Power Screen `Control` 总是采用相同的意图的主要内容,如果未能解决你的问题,请参考以下文章