Android - Flutter flutterplugin 与 methodchannel 创建与使用

835 阅读1分钟

BaseFlutterPlugin 自己定义的BasePlugin,只是为了简化一些重复代码

package com.maiya.call.flutter.base

import android.app.Activity
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodChannel

// ActivityAware 获取activity
abstract class BaseFlutterPlugin : FlutterPlugin , ActivityAware {

    var channel : MethodChannel? = null
    var handler : BaseMethodCallHandler? = null
    var activity : Activity? = null

    abstract fun createMethodCallHandler(messenger: BinaryMessenger) : BaseMethodCallHandler

    abstract fun createMethodChannel(messenger: BinaryMessenger) : MethodChannel

    abstract fun onAttachedToEngineFinish(binding: FlutterPlugin.FlutterPluginBinding)

    abstract fun onDetachedFromEngineFinish(binding: FlutterPlugin.FlutterPluginBinding)

    open fun onAttachedToActivityBefore(binding: ActivityPluginBinding){}
    open fun onAttachedToActivityAfter(binding: ActivityPluginBinding){}

    open fun onDetachedFromActivityForConfigChangesBefore(){}
    open fun onDetachedFromActivityForConfigChangesAfter(){}

    open fun onReattachedToActivityForConfigChangesBefore(binding: ActivityPluginBinding){}
    open fun onReattachedToActivityForConfigChangesAfter(binding: ActivityPluginBinding){}

    open fun onDetachedFromActivityBefore(){}
    open fun onDetachedFromActivityAfter(){}

    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        onAttachedToEngine(binding.binaryMessenger)
        onAttachedToEngineFinish(binding)
    }

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

    private fun onAttachedToEngine(messenger: BinaryMessenger) {
        channel = createMethodChannel(messenger)
        handler = createMethodCallHandler(messenger)
        channel?.setMethodCallHandler(handler)
    }

    private fun onDetachedFromEngine() {
        channel?.setMethodCallHandler(null)
        channel = null
    }

    override fun onAttachedToActivity(binding: ActivityPluginBinding) {
        onAttachedToActivityBefore(binding)
        activity = binding.activity
        handler?.attachActivity(binding.activity)
        onAttachedToActivityAfter(binding)
    }

    override fun onDetachedFromActivityForConfigChanges() {
        onDetachedFromActivityForConfigChangesBefore()
        activity = null
        handler?.detachActivity()
        onDetachedFromActivityForConfigChangesAfter()
    }

    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
        onReattachedToActivityForConfigChangesBefore(binding)
        activity = binding.activity
        handler?.attachActivity(binding.activity)
        onReattachedToActivityForConfigChangesAfter(binding)
    }

    override fun onDetachedFromActivity() {
        onDetachedFromActivityBefore()
        activity = null
        handler?.detachActivity()
        onDetachedFromActivityAfter()
    }
}

BaseMethodCallHandler 只是为了简化一些重复代码

package com.maiya.call.flutter.base

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.widget.Toast
import com.maiya.call.activity.WebViewActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel


abstract class BaseMethodCallHandler : MethodChannel.MethodCallHandler {
    var activity : Activity? = null
    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {

        if(resolveBaseMethod(call,result))return
        resolveMethodCall(call,result)
    }

    // 继承实现这个方法
    abstract fun resolveMethodCall(call: MethodCall, result: MethodChannel.Result)

    // 处理一些公共方法
    private fun resolveBaseMethod(call: MethodCall, result: MethodChannel.Result):Boolean{
        when(call.method){

        }
        return false
    }

    fun attachActivity(activity: Activity){
        this.activity = activity
    }

    fun detachActivity(){
        activity = null;
    }
}

一般使用分别继承BaseMethodCallHandler 与 BaseMethodCallHandler

class SplashMethodCallHandler : BaseMethodCallHandler() {

    override fun resolveMethodCall(call: MethodCall, result: MethodChannel.Result) {
    //处理flutter调用android
    }
}
class SplashPlugin : BaseFlutterPlugin() {
    private val channelName = "com.maiya.call.splash"
    override fun createMethodCallHandler(messenger: BinaryMessenger): BaseMethodCallHandler {

        return SplashMethodCallHandler()
    }

    override fun createMethodChannel(messenger: BinaryMessenger): MethodChannel {
        return MethodChannel(messenger,channelName)
    }

    override fun onAttachedToEngineFinish(binding: FlutterPlugin.FlutterPluginBinding) {

    }

    override fun onDetachedFromEngineFinish(binding: FlutterPlugin.FlutterPluginBinding) {

    }
}

Plugin的注册,我现在的处理方式是在flutterActivity中注册

class FlutterSplashActivity : FlutterActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        flutterEngine?.plugins?.add(SplashPlugin())
    }
   }