我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通道:MethodChannel.该通道主要通过方法实现通信功能,我们可以通
过方法的参数在通道上传递数据,该通道支持双向通信,就是说Flutte既可以使用通道给原生平台发送数据,也可以使用通道接收原生平台发来的数据。
通道的使用方法在前面章节已经介绍过,不过比较抽象,我们在这里通过具体的示例代码来演示:
flutterMethodChannel = MethodChannel("www.acf.com/battery");
result = await flutterMethodChannel.invokeMethod("getBattery",data);
class MainActivity: FlutterActivity() {
private val channel = "www.acf.com/battery"
//重写方法来设置chanel监听器,用来监听channel中的方法
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,channel)
// 设置监听器用来监听channel中的方法,就是flutter代码中的invokeMethod()方法调用的方法
methodChannel.setMethodCallHandler { call, result ->
//判断是否是获取电量的方法,不是则返回错误,返回内容通过监听器中的result参数返回
if(call.method == "getBattery") {
//从arguments参数中获取数据
var data = call.arguments
Log.d(TAG, "configureFlutterEngine: arguments: "+data.toString())
val battery = getBattery()
if(battery == -1) {
result.error("300","unKnowError",null)
}else {
result.success(battery)
}
}else {
result.notImplemented()
}
}
}
}
private fun getBattery(): Int {
var res = 0
if(Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
res = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}else {
val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(
Intent.ACTION_BATTERY_CHANGED))
}
return res;
}
我们在这里使用的示例代码主要参考了官方文档中给的示例,同时结合了自己的分析。上面步骤中的3和4是在Andoird平台上编写的,位于MainActivity.kt文件中。
我们还需要在IOS平台上实现类似的代码,我在这里就不演示了,因为它们的思路相同。
本章回中介绍的MethodChannel通道类似方法,Flutter通过方法的参数给原生平台发送数据。原生平台通过方法的返回值给Flutter发送数据。这样便实现了双向通
信功能。我在这里就不演示程序的运行结果了,建议大家自己动手去实现。不过我分享一些编译时的经验。