跳到主要内容

~/posts · 2026.01.02

返回桌面以后,让传输继续跑

Android 的返回键先收起应用,桌面关闭窗口先隐藏到托盘,真正退出再结束进程。

1 分钟 devshan
文章目录

应用已经有上传和下载,按一次返回就退出,刚开始的任务也跟着中断。我把“离开界面”和“结束程序”分开处理,Android 与当时的桌面实现分别接到各自的平台入口。

下面记录的是这次的处理方式。后来的桌面端换了实现,关闭与退出仍沿用这层区分。

Android 的返回键不再退出

在文件页根目录按返回,原来走 SystemNavigator.pop(),应用直接退了。其他页面按返回是回上一页,两边行为不一致。

改法是在 vaultoz/core 的 MethodChannel 里加一个方法:

"moveToBackground" -> {
    moveTaskToBack(true)
    result.success(null)
}

moveTaskToBack(true) 是 Activity 自带的能力,效果接近按 Home。Flutter 这边 NativeCoreService.moveToBackground() 调过去,files_page.dart 里在根目录判断平台:Android 就放后台,其他平台还是 pop。

关掉窗口,进程还留着

Windows 上原来点关闭就是退出。想要的是最小化到托盘,从托盘菜单里才真正退出。用了 tray_manager 加 window_manager。

关键在 windowManager.setPreventClose(true),不设这个,onWindowClose 不会按预期拦住关闭。拦到之后 windowManager.hide() 把窗口藏起来,进程继续跑;托盘菜单的“退出”才调 windowManager.destroy()。

@override
void onWindowClose() async {
  if (await windowManager.isPreventClose()) {
    await hideToTray();
  }
}

托盘菜单只有两项:显示窗口,恢复并聚焦;退出,销毁窗口。初始化放在 main() 里,判一下 Platform.isWindows。

改完试了返回键、窗口恢复和退出,再查看核心进程有没有跟着停止。