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` 总是采用相同的意图的主要内容,如果未能解决你的问题,请参考以下文章

Power Apps 弹出界面 popup dialog

Android 7.0 Power 按键处理流程

请问我在android 4.0上怎么用power键关屏

Android开发中如何可以捕获到短按power键的事件

为啥Android中的文件'/sys/power/state'总是'mem'?

Android Lock Screen Orientation