Mvvmcross Android Notification将参数传递给现有ViewModel

时间:2018-02-12 16:06:35

标签: android notifications mvvmcross

我有一个带通知的前台服务。当用户单击通知时,它将使用户返回到主屏幕视图模型(或者如果卸载则再次加载)。

我想在通知中添加2个操作(暂停,停止)。最好使用参数调用相同的viewmodel来指示操作类型,并让主屏幕viewmodel来处理操作。由于主屏幕视图模型可能已经加载,因此不再执行初始化。传递参数如显示viewmodel不起作用。现有的viewmodel不知道它确实是从通知中触发的。

如何将每个操作类型的不同参数传递给viewmodel,并在viewmodel中检索它以相应地执行操作?或者它应该以不同的方式完成?

这是通知的代码:

                var request = MvxViewModelRequest<RouteLayoutViewModel>.GetDefaultRequest();
                var intent = Mvx.Resolve<IMvxAndroidViewModelRequestTranslator>().GetIntentFor(request);
                const int pendingIntentId = 0;
                PendingIntent pendingIntent = PendingIntent.GetActivity(Application.Context, pendingIntentId, intent, PendingIntentFlags.UpdateCurrent);

                var builder = new NotificationCompat.Builder(this);

                builder
                    .SetContentTitle(AppConstants.AppName)
                    .SetContentText("notification_text")
                    .SetSmallIcon(Resource.Drawable.Icon)
                    .SetContentIntent(pendingIntent); ..........

                var notification = builder.Build();

                StartForeground(AppConstants.SERVICE_RUNNING_NOTIFICATION_ID, notification);

谢谢,

尼克

1 个答案:

答案 0 :(得分:0)

MvvmCross 5改变了ViewModel参数在内部序列化的方式。 MvvmCross 5尚未更新以处理此场景AFAIK。下面是一些示例代码,演示如何使用当前的BroadcastReceiver解决问题。这种方法允许您在用户点击Android通知后使用参数进行导航。

当您构建通知时:

var intent = new Intent(context, typeof(YourBroadcastReceiver));
intent.SetAction("YOUR_ACTION");
// Put your other parameters here...
intent.PutExtra("id", id);
var pendingIntent = PendingIntent.GetBroadcast(context, _notificationId, intent, PendingIntentFlags.UpdateCurrent);
...
notificationBuilder.SetContentIntent(pendingIntent);

然后你添加一个BroadcastReceiver类:

[BroadcastReceiver]
public class YourBroadcastReceiver : MvxBroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action == "YOUR_ACTION")
        {
            // TODO: Extract the contents from the intent.
            var id = intent.GetIntExtra("id", 0);
            // TODO: Navigate using IMvxNavigationService using the parameters pulled from the Intent.
        }
    }
}