MessagingCenter.Send无法触发MainActivity中的Subscribe方法排查
MAUI中MessagingCenter无法触发Android端订阅的问题排查
问题根源及修正点:
- MessagingCenter泛型类型不匹配
MessagingCenter的Send和Subscribe必须使用一致的发送者类型,原代码完全搞错了用法:
- 原
Send<String>("user_name", "Message_text")写法错误:泛型参数应该是发送者的类型(比如MainPage),而非消息内容的类型;第一个参数必须是发送者的实例(比如this),不是消息内容。 - 对应的
Subscribe也要使用相同的发送者类型,才能匹配到消息。
- MainActivity的OnCreate重载错误
你重写的是带PersistableBundle persistentState的OnCreate重载,这个方法在MAUI启动流程中不会被调用,导致订阅代码根本没执行。应该重写不带第二个参数的OnCreate方法。
修正后的代码:
MainPage.xaml.cs
public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } [Obsolete] private void Button1_Clicked(object sender, EventArgs e) { // 泛型指定发送者类型为MainPage,传递当前实例this,消息标识"Message_text",附带消息内容"user_name" MessagingCenter.Send<MainPage, string>(this, "Message_text", "user_name"); } }
Platforms\Android\MainActivity.cs
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] public class MainActivity : MauiAppCompatActivity { [Obsolete] protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Toast.MakeText(this, "OnCreate", ToastLength.Long).Show(); // 泛型对应发送者类型MainPage,接收string类型的消息内容 MessagingCenter.Subscribe<MainPage, string>(this, "Message_text", (sender, value) => { DisplayMessage(value); }); } private void DisplayMessage(string value) { Toast.MakeText(this, "Message Text = " + value, ToastLength.Long).Show(); } }
额外提示:
MessagingCenter在MAUI中已被标记为过时,官方推荐使用WeakReferenceMessenger(来自CommunityToolkit.Mvvm包),新项目建议切换到该方案,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

