使用 MessagingCenter 从 Android MainActivity 向不在 Android 项目中的视图模型 class 发送消息时遇到问题
Having trouble using MessagingCenter to send a message from Android MainActivity to view model class not in Android project
我试图按照 here 中的说明在打开特定视图的通知点击上添加 MessagingCenter 订阅操作。在某个地方,我的发送/订阅没有互相交谈,我只是看不到在哪里。消息中心的详细信息对我来说仍然是新的,所以我确定我只是在某处使用了错误的 class 或发件人。
下面的代码已根据 link 中显示给我的代码进行了修改。不过思路还是差不多的。
这是我的 FirebaseService class:
中的 SendLocalNotification 方法
void SendLocalNotification(string body)
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.SingleTop);
intent.PutExtra("OpenPage", "SomePage");
//Unique request code to avoid PendingIntent collision.
var requestCode = new Random().Next();
var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);
var notificationBuilder = new NotificationCompat.Builder(this)
.SetContentTitle("Load Match")
.SetSmallIcon(Resource.Drawable.laundry_basket_icon_15875)
.SetContentText(body)
.SetAutoCancel(true)
.SetShowWhen(false)
.SetContentIntent(pendingIntent);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
}
这里是 OnNewIntent 方法 android MainActivity:
protected override void OnNewIntent(Intent intent)
{
if (intent.HasExtra("OpenPage"))
{
MessagingCenter.Send(this, "Notification");
}
base.OnNewIntent(intent);
}
这里是我尝试在 LoadsPageViewModel(不在 android 项目)中订阅消息的地方:
public LoadsPageViewModel()
{
MessagingCenter.Subscribe<LoadsPageViewModel>(this, "Notification", (sender) =>
{
// navigate to a view here
});
}
要使 MessagingCenter
正常工作,您需要对发送方和订阅方使用相同的 type/object。
由于您是从 Android 项目发送的,因此您在此处使用的 this
值:
MessagingCenter.Send(this, "Notification");
代表主Activity.
当您在 ViewModel 中订阅时,您使用的是 ViewModel 对象
MessagingCenter.Subscribe<LoadsPageViewModel>(this, "Notification", (sender) => { });
这就是您收不到对方消息的原因。
要使其正常工作,您需要更改以下内容:
在Android Main Activity中,使用Xamarin.Forms.Application Class:
MessagingCenter.Send(Xamarin.Forms.Application.Current, "Notification");
并且在您的 ViewModel 中使用相同的 Xamarin.Forms.Application class 和对象:
MessagingCenter.Subscribe<Xamarin.Forms.Application>(Xamarin.Forms.Application.Current, "Notification", (sender) =>
{
Console.WriteLine("Received Notification...");
});
这样你就会符合 MessagagingCenter
的期望。
希望对您有所帮助。-
我试图按照 here 中的说明在打开特定视图的通知点击上添加 MessagingCenter 订阅操作。在某个地方,我的发送/订阅没有互相交谈,我只是看不到在哪里。消息中心的详细信息对我来说仍然是新的,所以我确定我只是在某处使用了错误的 class 或发件人。
下面的代码已根据 link 中显示给我的代码进行了修改。不过思路还是差不多的。
这是我的 FirebaseService class:
中的 SendLocalNotification 方法void SendLocalNotification(string body)
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.SingleTop);
intent.PutExtra("OpenPage", "SomePage");
//Unique request code to avoid PendingIntent collision.
var requestCode = new Random().Next();
var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);
var notificationBuilder = new NotificationCompat.Builder(this)
.SetContentTitle("Load Match")
.SetSmallIcon(Resource.Drawable.laundry_basket_icon_15875)
.SetContentText(body)
.SetAutoCancel(true)
.SetShowWhen(false)
.SetContentIntent(pendingIntent);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
}
这里是 OnNewIntent 方法 android MainActivity:
protected override void OnNewIntent(Intent intent)
{
if (intent.HasExtra("OpenPage"))
{
MessagingCenter.Send(this, "Notification");
}
base.OnNewIntent(intent);
}
这里是我尝试在 LoadsPageViewModel(不在 android 项目)中订阅消息的地方:
public LoadsPageViewModel()
{
MessagingCenter.Subscribe<LoadsPageViewModel>(this, "Notification", (sender) =>
{
// navigate to a view here
});
}
要使 MessagingCenter
正常工作,您需要对发送方和订阅方使用相同的 type/object。
由于您是从 Android 项目发送的,因此您在此处使用的 this
值:
MessagingCenter.Send(this, "Notification");
代表主Activity.
当您在 ViewModel 中订阅时,您使用的是 ViewModel 对象
MessagingCenter.Subscribe<LoadsPageViewModel>(this, "Notification", (sender) => { });
这就是您收不到对方消息的原因。
要使其正常工作,您需要更改以下内容:
在Android Main Activity中,使用Xamarin.Forms.Application Class:
MessagingCenter.Send(Xamarin.Forms.Application.Current, "Notification");
并且在您的 ViewModel 中使用相同的 Xamarin.Forms.Application class 和对象:
MessagingCenter.Subscribe<Xamarin.Forms.Application>(Xamarin.Forms.Application.Current, "Notification", (sender) =>
{
Console.WriteLine("Received Notification...");
});
这样你就会符合 MessagagingCenter
的期望。
希望对您有所帮助。-