在Xamarin Android的点击事件中区分应用程序小部件的实例

时间:2018-05-30 10:11:52

标签: android xamarin android-pendingintent android-appwidget

我遇到使用Xamarin Android将点击事件绑定到应用小部件的问题。点击工作正在运行,并且正在启动活动,但是为了区分小部件而传递的信息不起作用。似乎为窗口小部件的所有实例注册了相同的意图。

以下是从服务进行点击绑定的代码的简化示例。完整代码还会更新小部件上的文本。该部分工作正常,并且在窗口小部件的每个实例上都不同,所以我相信整体更新模式是正确的。这使得我将意图/待定意图绑定作为问题。我在下面使用的模式是否有问题?

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    var manager = AppWidgetManager.GetInstance(this);
    var ids = intent.GetIntArrayExtra(AppWidgetManager.ExtraAppwidgetIds);

    foreach (var id in ids)
    {
        var widgetView = new RemoteViews(PackageName, Resource.Layout.SingleRateWidget);
        var activityIntent = new Intent(this, typeof(ExchangesActivity));
        activityIntent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
        activityIntent.PutExtra("WidgetId", id);
        var pendingIntent = PendingIntent.GetActivity(this, 0, activityIntent, PendingIntentFlags.UpdateCurrent);
        widgetView.SetOnClickPendingIntent(Resource.Id.widgetBackground, pendingIntent);
        manager.UpdateAppWidget(id, widgetView);
    }

    return StartCommandResult.Sticky;
}

感谢。

1 个答案:

答案 0 :(得分:0)

经过更多搜索后,我在Java Android开发的问题中找到了修复程序:

Multiple Instances Of Widget Only Updating Last widget

简短回答,将待处理意图的创建更改为:

var pendingIntent = PendingIntent.GetActivity(this, id, activityIntent, PendingIntentFlags.UpdateCurrent);

答案很长,Android没有看到待处理意图的差异,因此每次重复使用相同的待处理意图。对PutExtra有意图并不足以区分这些行为。通过将requestCode设置为窗口小部件ID,可以使挂起的意图成为唯一的。另一种选择是使用唯一的URI(使用app widget id)对action action执行SetData,但是在挂起的intent上使用requestCode更容易。