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
对你所有的卡片都是独一无二的)
我正在与 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
对你所有的卡片都是独一无二的)