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

Flutter集成Google Assistant时onNewIntent未触发,APP重复调用致状态丢失

解决Flutter集成Google Assistant时重复调用App Intent导致应用刷新的问题

核心问题分析

每次调用OPEN_APP_FEATURE Intent时,你的Flutter Activity会重新执行onCreate()流程而非触发onNewIntent(),导致应用状态丢失。尽管设置了singleTask/singleTop启动模式,但App Actions触发的Intent默认未携带FLAG_ACTIVITY_SINGLE_TOP标记,导致启动模式配置未生效。

解决方案步骤

1. 确认Activity启动模式配置

在AndroidManifest.xml中,给MainActivity设置launchMode="singleTop",同时指定taskAffinity避免任务栈混淆:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop"
    android:taskAffinity="com.your.package.name"
    android:exported="true">
    <!-- 原有intent-filter、meta-data等配置 -->
</activity>

2. 为App Action Intent添加SingleTop标记

在shortcuts.xml中,给每个关联OPEN_APP_FEATURE的shortcut的intent添加android:flags="activitySingleTop"属性:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:shortcutId="get_next"
        android:enabled="true"
        android:shortcutShortLabel="@string/get_next_short"
        android:shortcutLongLabel="@string/get_next_long">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.your.package.name"
            android:targetClass="com.your.package.name.MainActivity"
            android:flags="activitySingleTop" /> <!-- 关键标记 -->
        <capability-binding android:key="actions.intent.OPEN_APP_FEATURE">
            <parameter-binding
                android:key="feature"
                android:value="next" />
        </capability-binding>
    </shortcut>
    <shortcut
        android:shortcutId="like_action"
        android:enabled="true"
        android:shortcutShortLabel="@string/like_short"
        android:shortcutLongLabel="@string/like_long">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.your.package.name"
            android:targetClass="com.your.package.name.MainActivity"
            android:flags="activitySingleTop" /> <!-- 关键标记 -->
        <capability-binding android:key="actions.intent.OPEN_APP_FEATURE">
            <parameter-binding
                android:key="feature"
                android:value="like" />
        </capability-binding>
    </shortcut>
</shortcuts>

3. 在MainActivity中处理onNewIntent()

修改MainActivity代码,重写onNewIntent()方法,在这里解析Intent参数并通过Method Channel调用Flutter方法,替代仅在onCreate()中处理的逻辑:

class MainActivity : FlutterActivity() {
    private lateinit var channel: MethodChannel

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "your_channel_name")
        // 处理首次启动的Intent
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        // 处理新触发的Intent
        intent?.let { handleIntent(it) }
    }

    private fun handleIntent(intent: Intent) {
        val feature = intent.getStringExtra("feature")
        when (feature) {
            "next" -> channel.invokeMethod("getNext", null)
            "like" -> channel.invokeMethod("like", null)
            else -> {}
        }
    }
}

4. 验证效果

重新编译安装应用后,通过Google Assistant触发对应指令,检查应用是否不再刷新、状态是否保留,且每次调用都能正确触发Flutter的getNext()或like()方法。

关键注意事项

  • 确保所有关联OPEN_APP_FEATURE的shortcut的intent都添加了activitySingleTop标记
  • 必须在onNewIntent()中处理新Intent,不能仅依赖onCreate()
  • 使用singleTask模式时,需保证taskAffinity配置正确,避免Intent被发送到错误任务栈

内容的提问来源于stack exchange,提问作者Todd Vermeir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:48:21