通過MethodChannel與安卓原生進行通信
Flutter代碼:
先寫一個通道類督禽,定義通道名(plugin_demo)和方法名(jumpToActivity)巍棱,通道是異步的所以要用async await
class PluginManager {
static const MethodChannel _channel =
const MethodChannel('plugin_demo');
static Future<String> pushFirstActivity(Map params) async {
String resultStr = await _channel.invokeMethod('jumpToActivity', params);
return resultStr;
}
}
隨便寫個按鈕調(diào)用通道:
onPressed: () async {
String resultString;
try {
resultString = await PluginManager.pushFirstActivity({'key': 'value'});
} on PlatformException {
resultString = '失敗';
}
print(resultString);
}
安卓代碼:
找到項目中的安卓MainActivity丛忆,點擊右上角的在Android Studio中打開,等待gradle自動配置好贞远,紅色報錯就沒了
MainActivity代碼:
package com.example.flutter_jumpto_android;
import android.content.Intent;
import io.flutter.embedding.android.FlutterActivity;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "plugin_demo";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if (call.method.equals("jumpToActivity")) {
// 參數(shù)
String params = call.argument("key");
// 跳轉(zhuǎn)
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
intent.putExtra("activityKey", params);
startActivity(intent);
result.success(params);
} else {
result.notImplemented();
}
}
});
}
}
在我們監(jiān)聽了指定channel(plugin_demo)蹬刷,onMethodCall中會收到來自flutter的通道信息瓢捉,根據(jù)不同方法名處理不同事件,比如我們監(jiān)聽到j(luò)umpToActivity方法:
if (call.method.equals("jumpToActivity")) {
// 參數(shù)
String params = call.argument("key");
// 跳轉(zhuǎn)
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
intent.putExtra("activityKey", params);
startActivity(intent);
result.success(params);
}
call.argument("key")可以獲取指定key的值办成,call.arguments可以獲取全部參數(shù)泡态,然后使用Intent跳轉(zhuǎn):
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
intent.putExtra("activityKey", params);
startActivity(intent);
處理通道消息后需要調(diào)用result.success把通信結(jié)果傳給flutter
result.success("success");
順便一問,我這跳轉(zhuǎn)的Activity都沒有返回鍵怎么回事迂卢,雕大的解答下:
public class FirstActivity extends Activity {