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

Flutter应用从通知打开后,最近应用列表显示双实例问题求助

Flutter应用多实例问题解决

问题描述

开发Flutter应用时遇到以下问题:
使用AlarmService创建通知,点击通知可正常打开应用;但通过返回键关闭应用(未从最近列表移除)后,再次点击应用图标打开,最近应用列表会出现两个应用实例。已尝试设置android:launchMode="singleTop"但未解决问题。

相关配置代码

AndroidManifest.xml中MainActivity配置:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTop"
    android:taskAffinity=""
    android:theme="@style/LaunchTheme"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:enableOnBackInvokedCallback="true"
    android:windowSoftInputMode="adjustResize">

返回键关闭实现代码

PopScope(
    canPop: canPopNow,
    onPopInvokedWithResult: (didPop, result) {
        if (0 < controller.currentIndex.value) {
            canPopNow = false;
            controller.changePage(0);
        } else {
            DateTime now = DateTime.now();
            if (_lastPressedAt == null || now.difference(_lastPressedAt!) > Duration(seconds: 2)) {
                _lastPressedAt = now;
                VxToast.show(context, msg: "请再次点击返回键退出", textColor: Colors.black, bgColor: Colors.grey.shade300.withAlpha(128), showTime: 800);
                canPopNow = false;
            } else {
                SystemNavigator.pop();
                canPopNow = true;
            }
        }
    },
    child: Scaffold(
        // ... 页面内容
    )
)

解决方法

1. 修正Activity启动模式与任务亲和性

当前设置的android:taskAffinity=""会导致通知启动的Activity进入独立任务栈,和图标启动的任务栈分离,这是多实例的核心原因。修改配置如下:

  • 移除android:taskAffinity="",保持应用默认任务亲和性
  • 将launchMode改为singleTask,确保整个任务栈仅存在一个MainActivity实例,无论从通知还是图标启动都会复用现有实例

修改后的Activity配置:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:theme="@style/LaunchTheme"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:enableOnBackInvokedCallback="true"
    android:windowSoftInputMode="adjustResize">

2. 配置通知PendingIntent的启动标记

在AlarmService创建通知的PendingIntent时,添加必要的启动标记,确保启动时复用现有Activity实例:

PendingIntent pendingIntent = PendingIntent.getActivity(
    context,
    0,
    Intent(context, MainActivity.class)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP),
    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);

3. 验证返回键逻辑(可选)

当前返回键使用SystemNavigator.pop()仅将Activity退到后台,并非多实例的直接原因,但如果需要彻底退出应用,可替换为:

// 替换原SystemNavigator.pop()
Navigator.of(context).popUntil((route) => route.isFirst);
SystemNavigator.pop();

或谨慎使用exit(0)(直接终止进程,需考虑应用状态保存)。

内容的提问来源于stack exchange,提问作者Abhi Plx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:41:00