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

