Android 如何使用API从Flatter插件启动活动

Android 如何使用API从Flatter插件启动活动,android,flutter,kotlin,flutter-plugin,Android,Flutter,Kotlin,Flutter Plugin,因此,我正在制作一个flatter插件,并尝试在Android上运行Kotlin代码。问题是,此代码运行一种方法,该方法尝试在没有意图上的标志\u activity\u NEW\u TASK标志的情况下启动活动。这样做的问题是,当它试图在方法本身内部实例化实例时,它也没有办法给它一个intent实例。该方法期望从存储在UI上并从中调用的按钮或其他方法调用。但是,由于它是从颤振插件中的onMethodCall方法调用的,因此它似乎不起作用。我尝试了许多变通方法,比如在活动中添加一个方法,并在从Fl

因此,我正在制作一个flatter插件,并尝试在Android上运行Kotlin代码。问题是,此代码运行一种方法,该方法尝试在没有意图上的
标志\u activity\u NEW\u TASK
标志的情况下启动活动。这样做的问题是,当它试图在方法本身内部实例化实例时,它也没有办法给它一个
intent实例。该方法期望从存储在UI上并从中调用的按钮或其他方法调用。但是,由于它是从颤振插件中的
onMethodCall
方法调用的,因此它似乎不起作用。我尝试了许多变通方法,比如在活动中添加一个方法,并在从Flatter插件类调用它的同时在活动中运行代码。我也尝试过使用UIThread,但也没有成功。有解决办法吗

注意:由于隐藏此API,我没有提供任何代码。应该只知道我正在运行
onMethodCall
事件中的代码


错误:
从活动上下文外部调用startActivity()需要标志\u Activity\u NEW\u TASK标志。这真的是您想要的吗?

如您所述,对于颤振插件,任何依赖于平台的逻辑都应保存在颤振活动的子类中,该子类用于显示本机模块内的颤振模块/屏幕。现在您可以从该子类启动intent,而无需任何附加标志

@注意-flatterActivity的子类应保留在本机模块中

    class FlutterResponseActivity : FlutterActivity() {
        private var methodResult: Result? = null
        override fun provideFlutterEngine(context: Context): FlutterEngine? {
            return MyApplication.mContext.flutterEngine //Pre-warmed flutter engine
        }

        override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "startMainActivity" -> {
                    startMainActivity()
                    result.success(true)
                }
                else -> result.notImplemented()
            }
        }
    }

        private fun startMainActivity() {
             val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }

你可以扩展你的插件,在你的插件类中实现
ActivityAware
,当你实现它的时候,你会得到一些回调,这些回调给你当前的活动。像这样:

lateinit activity: Activity? = null
override fun onDetachedFromActivity() {
    activity = null
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    activity = binding.activity
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    activity = binding.activity
  }

  override fun onDetachedFromActivityForConfigChanges() {
    activity = null
  }
之后,您可以从指定的活动变量中启动Tactivity


如果您需要进一步的帮助,请告诉我。

我毫不怀疑这段代码可以正常工作,但我正在尝试通过一个Flutter插件来实现这一点,除了URL方案等之外,它几乎不需要手动配置本机代码。如果你能保证它在插件环境中是可用的,我想再看一看。简单看一下,它看起来像是一个颤振应用程序的解决方案,而不是一个颤振插件。我认为一个简单的解决方法会使类实现并注册接口,但我不想这样做,因为在我看来,这会使插件对开发人员不那么友好。@Fern您也可以尝试从dart插件进行深度链接并启动URI。从未尝试过这个,但我认为这个应该可以trick@TamilArasu有没有关于如何从插件调用android活动的示例?复制上面的代码并添加``activity.startActivity()“``有可能打开ui活动并获取数据吗?你可以打开活动并监听ActivityResult,然后将数据传回以下链接以获取官方文档:你有什么结果吗?@Alexufo我接触这个领域已经一年多了,所以我真的不记得我是如何让它工作的。我相信我最终得到了API或类似的东西,不过如果我再碰它一次,我会标记为解决方案,如果有的话。