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

如何从已集成的Flutter模块启动Android项目的Activity?

从Flutter模块调用Android Activity的实现方案(无需仅依赖DeepLink)

你完全不需要只靠DeepLink来实现这个需求,下面是两种实用的方案,其中MethodChannel是最灵活的首选:

一、MethodChannel自定义通信(推荐)

通过Flutter与原生的MethodChannel通道,直接调用Android的startActivity方法,支持传递任意参数,逻辑完全可控。

1. Android端实现

在你的Flutter承载页面(比如FlutterActivity或包含FlutterFragment的Activity)中注册MethodChannel并处理调用:

class MainActivity : FlutterActivity() {
    // 定义通道名称,两端要保持一致
    private val ACTIVITY_CHANNEL = "your.package.name/activity_launcher"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, ACTIVITY_CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                // 匹配Flutter端调用的方法名
                "launchAndroidActivity" -> {
                    // 获取Flutter传递的参数
                    val targetClass = call.argument<String>("class_name")
                    val extraData = call.argument<Map<String, Any>>("extra")

                    try {
                        // 构建Intent并启动Activity
                        val intent = Intent(this, Class.forName(targetClass!!))
                        extraData?.forEach { (key, value) ->
                            when (value) {
                                is String -> intent.putExtra(key, value)
                                is Int -> intent.putExtra(key, value)
                                // 支持更多数据类型,按需扩展
                            }
                        }
                        startActivity(intent)
                        result.success("Activity已启动")
                    } catch (e: Exception) {
                        result.error("LAUNCH_FAILED", "启动失败:${e.message}", null)
                    }
                }
                else -> result.notImplemented()
            }
        }
    }
}

2. Flutter端调用

在Flutter代码中创建工具类,通过MethodChannel发起调用:

import 'package:flutter/services.dart';

class AndroidActivityLauncher {
  static const _channel = MethodChannel('your.package.name/activity_launcher');

  static Future<String?> launch(String className, [Map<String, dynamic>? extraData]) async {
    try {
      return await _channel.invokeMethod(
        'launchAndroidActivity',
        {
          'class_name': className,
          'extra': extraData,
        },
      );
    } on PlatformException catch (e) {
      print("启动错误:${e.message}");
      return null;
    }
  }
}

// 调用示例
AndroidActivityLauncher.launch(
  "com.example.YourTargetActivity",
  {'user_id': 123, 'user_name': 'FlutterUser'},
);

二、url_launcher插件(适合简单场景)

如果你的目标Activity已经配置了自定义Scheme,可以用url_launcher插件通过Scheme跳转,但这种方式传递复杂数据不如MethodChannel方便,适合简单场景:

1. Android端配置Scheme

在AndroidManifest.xml中给目标Activity添加Scheme:

<activity android:name=".YourTargetActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 自定义Scheme -->
        <data android:scheme="myapp" android:host="target" />
    </intent-filter>
</activity>

2. Flutter端调用

import 'package:url_launcher/url_launcher.dart';

void launchTargetActivity() async {
  final uri = Uri.parse('myapp://target?user_id=123&user_name=FlutterUser');
  if (await canLaunchUrl(uri)) {
    await launchUrl(uri);
  } else {
    print("无法启动目标Activity");
  }
}

总结

  • MethodChannel:灵活度最高,支持任意数据传递和复杂逻辑,是集成场景下的首选方案。
  • Scheme+url_launcher:适合已有Scheme配置的简单跳转场景,无需编写原生通信代码,但扩展性差。
    完全不需要局限于DeepLink,根据你的需求选择合适的方案即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:32