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
相关产品推荐
相关产品推荐

