.NET Maui侧载应用更新后OnActivityResult未触发,如何实现后续操作?
.NET Maui侧载应用更新后OnActivityResult不触发的解决方案
问题原因
当用户确认安装更新APK时,Android系统会直接终止旧应用的所有进程,替换为新应用进程。此时发起更新请求的旧MainActivity已被销毁,无法触发OnActivityResult回调——这是Android系统的固有行为,因此用OnActivityResult监听更新成功的场景本身不可行。
替代解决方案:持久化标记+启动时校验
通过本地存储标记更新状态,在应用重启后(更新完成后系统会自动启动新应用)校验标记来执行更新后的操作,具体步骤如下:
- 发起更新前,将更新状态保存到持久化存储(推荐用.NET MAUI内置的
Preferences)。 - 在
OnActivityResult的取消分支中清除标记,执行取消后的操作。 - 在应用启动入口检查标记,若存在则说明是更新后首次启动,执行更新成功后的操作并清除标记。
代码示例
1. 发起更新时保存标记
// 标记当前处于更新流程中 Preferences.Set("IsUpdating", true); var installIntent = new Intent(Intent.ActionView); installIntent.AddFlags(ActivityFlags.ClearTop); installIntent.AddFlags(ActivityFlags.GrantReadUriPermission); installIntent.SetDataAndType(apkUri?.NormalizeScheme(), GetMimeType()); MainActivity.Current.StartActivityForResult(installIntent, Config.UPDATE_ACTIVITY_REQUEST_CODE);
2. 修改OnActivityResult处理取消场景
protected override void OnActivityResult(int requestCode, Result resultCode, Intent? data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == Config.UPDATE_ACTIVITY_REQUEST_CODE) { if (resultCode == Result.Canceled) { // 更新取消,清除标记 Preferences.Remove("IsUpdating"); // 执行更新取消后的逻辑,比如提示用户已取消更新 } // 无需处理Result.Ok,因为更新成功时旧应用进程已被销毁,不会进入此分支 } }
3. 应用启动时校验标记
在App.xaml.cs中:
protected override void OnStart() { base.OnStart(); if (Preferences.Get("IsUpdating", false)) { // 执行更新成功后的逻辑,比如显示更新完成提示、初始化新功能等 // ... // 清除标记,避免下次启动重复执行 Preferences.Remove("IsUpdating"); } }
注意事项
.NET MAUI的Preferences在Android平台底层基于SharedPreferences,无需额外申请权限即可读写。- 若需要更复杂的状态传递,也可以使用本地文件或SQLite存储,但
Preferences对于简单标记场景足够轻便。
内容的提问来源于stack exchange,提问作者Marc Miller
相关产品推荐
相关产品推荐

