本文首发于公众号:移动开发那些事Flutter plugin开发小知识之:ActivityAware 详解
1 背景
在 Flutter
插件开发里,如果插件需要和 Android
Activity
进行交互,或者要感知 Activity
的生命周期变化,那就得使用 ActivityAware
接口啦。 ActivityAware
允许插件感知宿主Android
应用的Activity
生命周期变化,从而能够根据Activity
的状态调整插件的行为。本文将详细介绍ActivityAware
的相关知识。
2 ActivityAware
概述
当plugin
实现了这个接口后,Flutter
引擎会在插件被添加到宿主应用时调用相应的方法,使插件能够获取当前Activity
的引用,并感知Activity
的生命周期变化。
2.1 使用场景
- 获取
Activity
上下文: 用于一些与Activity
相关的操作,如权限请求等; - 监听
Activity
生命周期: 需要监听其生命周期来实现自身plugin
的逻辑的处理,如前后台切换的处理; - 处理
onActivityResult
: 如处理相机、文件选择等返回结果;
2.2 核心方法
onAttachedToActivity(ActivityPluginBinding binding)
当插件和Activity
绑定时,会调用这个方法。通过ActivityPluginBinding
,插件可以获取 Activity
的引用,还能注册 Activity
结果回调以及请求权限的回调。
onDetachedFromActivityForConfigChanges()
当 Activity
因为配置变更(例如屏幕旋转)暂时和插件分离时,会触发该方法。此时,插件应当释放和 Activity
相关的资源。
onReattachedToActivityForConfigChanges(ActivityPluginBinding binding)
在 Activity
配置变更完成并重新和插件绑定时,会调用这个方法。插件可以借此重新初始化和 Activity
相关的资源。
onDetachedFromActivity()
当插件和 Activity
的绑定永久解除时,会执行该方法。插件需要在此释放所有和 Activity
相关的资源。
3 示例
下面以一个简单的 Flutter
插件为例,展示实现 ActivityAware
接口的具体步骤:
kotlin
class MyPlugin : FlutterPlugin, ActivityAware {
private var flutterPluginBinding: FlutterPlugin.FlutterPluginBinding? = null
/// 这里其实也可以用弱引用的方式来做
private var activity: Activity? = null
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
this.flutterPluginBinding = binding
// 初始化插件
}
// ActivityAware的几个方法 start
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
this.flutterPluginBinding = null
// 清理资源
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
this.activity = binding.activity
// 注册Activity生命周期回调
binding.addOnActivityDestroyedListener { onActivityDestroyed(it) }
}
override fun onDetachedFromActivityForConfigChanges() {
this.activity = null
// 释放和Activity相关的资源
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
this.activity = binding.activity
// 重新注册Activity生命周期回调
binding.addOnActivityDestroyedListener { onActivityDestroyed(it) }
}
override fun onDetachedFromActivity() {
this.activity = null
}
// ActivityAware的几个方法 end
private fun onActivityDestroyed(activity: Activity) {
// Activity被销毁时的处理
}
// 示例方法:从Flutter调用启动新的Activity
fun startNewActivity() {
activity?.let {
val intent = Intent(it, DemoActivity::class.java)
it.startActivity(intent)
} ?: run {
// 处理没有Activity引用的情况
Log.e("MyPlugin", "Activity reference is null")
}
}
}
4 总结
ActivityAware
是Flutter
插件开发中连接插件与Android
Activity
的关键接口,正确使用ActivityAware
可以大大增强插件的功能性和稳定性,特别是在需要与Android
原生组件交互的场景中