无法使用 MessagingCenter 从 Android MainActivity 发送消息以查看不在 Android 项目中的模型类

Posted

技术标签:

【中文标题】无法使用 MessagingCenter 从 Android MainActivity 发送消息以查看不在 Android 项目中的模型类【英文标题】:Having trouble using MessagingCenter to send a message from Android MainActivity to view model class not in Android project 【发布时间】:2020-04-18 01:46:53 【问题描述】:

我尝试按照 here 的说明在通知点击上添加一个 MessagingCenter 订阅操作,以打开特定视图。在某个地方我的发送/订阅没有互相交谈,我只是看不到在哪里。消息中心的细节对我来说仍然是新的,所以我确定我只是在某个地方使用了错误的类或发件人。

下面的代码已经根据链接中显示的内容进行了修改。这个想法仍然大致相同。

这是我的 FirebaseService 类中的 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());
    

这是android MainActivity中的OnNewIntent方法:

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
        );
    

【问题讨论】:

【参考方案1】:

要使MessagingCenter 工作,您需要在发送者和订阅者上使用相同的类型/对象。

由于您是从 Android 项目发送的,因此您在此处使用的 this 值:

MessagingCenter.Send(this, "Notification");

代表 MainActivity。

当您在 ViewModel 中订阅时,您正在使用 ViewModel 对象

MessagingCenter.Subscribe<LoadsPageViewModel>(this, "Notification", (sender) =>  );

这就是你没有收到对方消息的原因。

要使其正常工作,您需要更改以下内容:

在 Android Main Activity 中,使用 Xamarin.Forms.Application 类:

MessagingCenter.Send(Xamarin.Forms.Application.Current, "Notification");

并且在您的 ViewModel 中使用相同的 Xamarin.Forms.Application 类和对象:

MessagingCenter.Subscribe<Xamarin.Forms.Application>(Xamarin.Forms.Application.Current, "Notification", (sender) =>

    Console.WriteLine("Received Notification...");
);

这样你就可以满足MessagagingCenter 的期望。

希望这会有所帮助。-

【讨论】:

这看起来正是我所需要的,您向它展示了所有内容背后的一些解释。很棒的答案! 很抱歉用后续问题@pinedax 打扰您,但我只是试图将 MC.Subscribe 逻辑移动到不同的视图模型(我实际上想重定向到与最初不同的视图)已发布)并且无论出于何种原因,订阅都没有被击中。它在我在原始问题中发布的视图模型中完美运行。您对为什么它适用于一种视图模型而不适用于另一种视图模型有任何想法吗? @user1818298 将消息转移到另一个 ViewModel 时,您是否解决了问题? 我做到了。我不确定是什么原因造成的,但是当我将消息订阅到另一个视图模型时,它工作得很好,所以我只是采用这种方法:)

以上是关于无法使用 MessagingCenter 从 Android MainActivity 发送消息以查看不在 Android 项目中的模型类的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用 MessagingCenter 从另一个页面填充它来通信两个类时,ListView 没有填满

.NET MAUI实战 MessagingCenter

暂停 Zebra TC51 中的条码扫描器

无法从 Web 浏览器警报弹出窗口中使用 Selenium 获取文本

Xcode Server Bot 集成无法使用断言导出存档失败:exportArchive: ipatool failed with an exception

insufficient permission for adding an object to repository database .git/objects