我有一个带通知的前台服务。当用户单击通知时,它将使用户返回到主屏幕视图模型(或者如果卸载则再次加载)。
我想在通知中添加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);
谢谢,
尼克
答案 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.
}
}
}