You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui侧载应用更新后OnActivityResult未触发,如何实现后续操作?

.NET Maui侧载应用更新后OnActivityResult不触发的解决方案

问题原因

当用户确认安装更新APK时,Android系统会直接终止旧应用的所有进程,替换为新应用进程。此时发起更新请求的旧MainActivity已被销毁,无法触发OnActivityResult回调——这是Android系统的固有行为,因此用OnActivityResult监听更新成功的场景本身不可行。

替代解决方案:持久化标记+启动时校验

通过本地存储标记更新状态,在应用重启后(更新完成后系统会自动启动新应用)校验标记来执行更新后的操作,具体步骤如下:

  1. 发起更新前,将更新状态保存到持久化存储(推荐用.NET MAUI内置的Preferences)。
  2. 在OnActivityResult的取消分支中清除标记,执行取消后的操作。
  3. 在应用启动入口检查标记,若存在则说明是更新后首次启动,执行更新成功后的操作并清除标记。

代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:17:26