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

如何在Flutter Android插件中实现AppCompatActivity以使用registerForActivityResult?

如何在Flutter Android插件中使用registerForActivityResult请求通知权限

不需要单独创建继承自AppCompatActivity的独立Activity,利用Flutter插件的ActivityAware接口关联现有主Activity即可解决问题,具体步骤如下:

1. 让插件实现ActivityAware接口

这个接口能让插件感知Activity的生命周期变化,在合适的时机获取和释放Activity引用,这是使用registerForActivityResult的核心前提。

2. 在Activity关联时注册权限请求Launcher

当插件依附到Activity时,先判断当前Activity是否为AppCompatActivity实例(目前绝大多数Flutter项目的主Activity都满足这个条件),然后在该Activity的上下文下注册ActivityResultLauncher。

3. 处理权限请求与结果回调

通过MethodChannel接收Flutter端的权限请求调用,触发Launcher发起权限申请;权限结果返回后,再通过MethodChannel将结果回传给Flutter端。

完整Kotlin代码示例

class NotificationPermissionPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
    private var activity: AppCompatActivity? = null
    private var permissionLauncher: ActivityResultLauncher<String>? = null

    override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        val channel = MethodChannel(flutterPluginBinding.binaryMessenger, "notification_permission")
        channel.setMethodCallHandler(this)
    }

    override fun onAttachedToActivity(binding: ActivityPluginBinding) {
        activity = binding.activity as? AppCompatActivity
        activity?.let {
            permissionLauncher = it.registerForActivityResult(RequestPermission()) { granted ->
                // 将权限结果回传给Flutter端
                val channel = MethodChannel(
                    binding.flutterEngine?.dartExecutor?.binaryMessenger ?: return@registerForActivityResult,
                    "notification_permission"
                )
                channel.invokeMethod("permissionResult", granted)
            }
        }
    }

    override fun onDetachedFromActivityForConfigChanges() {
        activity = null
        permissionLauncher = null
    }

    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
        onAttachedToActivity(binding)
    }

    override fun onDetachedFromActivity() {
        activity = null
        permissionLauncher = null
    }

    override fun onMethodCall(call: MethodCall, result: Result) {
        when (call.method) {
            "requestPermission" -> {
                permissionLauncher?.launch(Manifest.permission.POST_NOTIFICATIONS) 
                    ?: result.error("NO_ACTIVITY", "未关联Activity", null)
            }
            else -> result.notImplemented()
        }
    }

    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {}
}

注意事项

  • 务必在Activity的生命周期范围内注册和调用Launcher,避免内存泄漏或调用失败,所以在onDetachedFromActivity和onDetachedFromActivityForConfigChanges时要及时清理引用。
  • 如果遇到主Activity不是AppCompatActivity的极端情况,建议引导用户修改主Activity继承AppCompatActivity,这是最稳妥的方案;也可以尝试使用兼容式的权限请求方式,但复杂度会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:10