.NET MAUI Blazor应用Intent处理异常:OnNewIntent未触发
问题根源及解决步骤
1. 核心问题:Activity启动模式错误
你的OnNewIntent从未触发,本质是MainActivity的启动模式未配置为复用实例的模式。默认启动模式下,系统每次收到Intent都会创建新的Activity实例,不会调用已存在实例的OnNewIntent方法,直接走OnCreate流程。
修正AndroidManifest.xml配置
找到MainActivity的节点,添加android:launchMode="singleTask",确保系统复用已存在的Activity实例:
<activity android:name=".MainActivity" android:launchMode="singleTask"> <!-- 保留你已配置的Intent过滤规则 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="mydomain.app" /> </intent-filter> </activity>
2. 修复OnNewIntent中的冗余代码
你当前代码里调用StartActivity(typeof(MainActivity))完全多余,会导致不必要的Activity栈操作。直接处理Intent并传递路径即可:
protected override void OnNewIntent(Intent intent) { base.OnNewIntent(intent); if (intent.Action != Intent.ActionView) return; var data = intent.DataString; if (string.IsNullOrWhiteSpace(data)) return; var path = data.Replace(@"https://mydomain.app", ""); // 用Preferences存储路径,供Blazor页面读取 Preferences.Set("IntentPath", path); // 实时通知Blazor页面导航(可选,避免等待页面渲染) MessagingCenter.Send(this, "NavigateToIntent", path); }
3. 完善Main.razor的导航逻辑
当前代码仅在OnAfterRender处理,需补充冷启动和实时消息监听的逻辑,覆盖所有场景:
@code { [Inject] public NavigationManager NavigationManager { get; set; } protected override void OnInitialized() { // 处理冷启动时的Intent路径(应用从关闭状态被Intent唤起) HandleIntentNavigation(); // 监听来自OnNewIntent的实时导航通知 MessagingCenter.Subscribe<MainActivity, string>(this, "NavigateToIntent", (_, path) => { NavigationManager.NavigateTo(path); Preferences.Remove("IntentPath"); }); } protected override void OnAfterRender(bool firstRender) { // 冷启动时可能Blazor尚未初始化完成,这里补一次处理 if (firstRender) { HandleIntentNavigation(); } } private void HandleIntentNavigation() { var intentPath = Preferences.Get("IntentPath", string.Empty); if (!string.IsNullOrWhiteSpace(intentPath)) { NavigationManager.NavigateTo(intentPath); Preferences.Remove("IntentPath"); } } }
4. 补充冷启动时的Intent处理
如果应用是完全关闭状态下被Intent唤起,OnNewIntent不会触发,需要在OnCreate中处理首次Intent:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 处理冷启动场景的Intent if (Intent.Action == Intent.ActionView) { var data = Intent.DataString; if (!string.IsNullOrWhiteSpace(data)) { var path = data.Replace(@"https://mydomain.app", ""); Preferences.Set("IntentPath", path); } } }
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

