如何在Kotlin的Activity中打开Flutter页面 实现点击通知跳转Flutter主页
实现思路
1. Kotlin原生端配置
- 给通知绑定指向Flutter宿主Activity的PendingIntent
你项目里继承FlutterActivity的主Activity(默认命名为MainActivity)就是Flutter应用的入口,点击通知要唤起的就是这个Activity。创建通知时给setContentIntent传入对应PendingIntent,同时配置Activity启动flag避免重复创建实例:// 构建跳转目标Intent val intent = Intent(context, MainActivity::class.java).apply { // 优先级:如果应用已在后台运行就拉到前台,不新建实例 flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP // 有跳转指定Flutter页面的需求时,可以在这里putExtra携带路由参数 } // 构建PendingIntent val pendingIntent: PendingIntent = PendingIntent.getActivity( context, 0, intent, // *注意Android 12及以上必须指定可变性标记,这里用UPDATE_CURRENT保证参数能更新 PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) // 给通知设置点击Intent val notification = NotificationCompat.Builder(context, channelId) .setContentIntent(pendingIntent) .setAutoCancel(true) // 点击后自动消失,按需开启 // 其他通知配置... .build() - 接收唤起参数并同步给Flutter
重写MainActivity的onCreate(应用冷启动场景)和onNewIntent(应用在后台被唤起场景)方法,拿到Intent携带的参数,通过你已经实现的MethodChannel发送给Flutter侧。如果是冷启动场景担心Channel还未初始化,可以先把参数暂存到本地缓存,等Flutter端初始化完成后主动调用Channel拉取。
2. Flutter端适配
- 监听原生端的唤起事件
在应用根Widget的initState生命周期里注册MethodChannel的调用回调,收到原生端发来的通知唤起事件后,直接导航到主页面即可:如果当前应用已经在后台运行,直接重置路由栈到主页面;如果是冷启动,正常初始化主页面即可。 - 路由逻辑优化
收到唤起事件后先判断当前路由栈的栈顶是否已经是主页面,如果是就不用重复跳转,避免页面栈冗余。如果原生端携带了指定路由参数,就跳转到对应Flutter页面。
可选优化
- 可以给Intent添加自定义Action,用来区分是普通桌面点击启动还是通知点击启动,两端根据不同启动类型做不同逻辑处理。
内容的提问来源于stack exchange,提问作者sebastian Ortiz
相关产品推荐
相关产品推荐

