android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信
題記:
——不到最后時刻,千萬別輕言放棄,無論結(jié)局成功與否,只要你拼博過,盡力過,一切問心無愧。
通過 Flutter 來進(jìn)行移動應(yīng)用開發(fā),打包 Android 、iOS 雙平臺應(yīng)用程序,在調(diào)用如相機(jī)、藍(lán)牙、錄音、鬧鐘、屏保等等系列功能時,需要與原生Android、iOS進(jìn)行消息通信,或者可描述為把數(shù)據(jù)由 Flutter 傳向 Android 、iOS,或者由原生的 Android 、iOS傳向 Flutter。
Flutter 與 Android iOS 原生的通信有以下三種方式?
BasicMessageChannel 實(shí)現(xiàn) Flutter 與 原生(Android 、iOS)雙向通信
MethodChannel 實(shí)現(xiàn) Flutter 與 原生原生(Android 、iOS)雙向通信
EventChannel 實(shí)現(xiàn) 原生原生(Android 、iOS)向Flutter 發(fā)送消息
本文將實(shí)現(xiàn):(通過 BasicMessageChannel)
實(shí)現(xiàn) Flutter 調(diào)用 Android 、iOS 原生的方法并回調(diào)Flutter
實(shí)現(xiàn) Flutter 調(diào)用 Android 、iOS 原生并打開Android 原生的一個Activity頁面,iOS原生的一個ViewController 頁面
實(shí)現(xiàn) Android 、iOS 原生主動發(fā)送消息到 Flutter 中
實(shí)現(xiàn) Android 、iOS 原生中的 TestActivity 頁面主動發(fā)送消息到Flutter中
Android 中的效果
ios 中的效果
前言
例如我們要實(shí)現(xiàn) A 調(diào)用 B,B就會觸發(fā),B再調(diào)用A,A就會觸發(fā)這樣的功能,那么我們就需要在 A 中設(shè)置 被B調(diào)用的監(jiān)聽方法,在B中設(shè)置被A 調(diào)用的監(jiān)聽方法
1 實(shí)現(xiàn)Flutter 調(diào)用 Andoid iOS原生方法并回調(diào)
在這里約定的數(shù)據(jù)格式為 {"code":100,"message":"消息","content":內(nèi)容}也就是說雙向發(fā)送消息,可能會有多種消息類型來調(diào)用不同的功能,
統(tǒng)一約定數(shù)據(jù)格式 可以達(dá)到編碼的規(guī)范性和代碼的可維護(hù)性
1.1 實(shí)現(xiàn) Flutter 中調(diào)用方法
String recive = "";//創(chuàng)建 BasicMessageChannel
// flutter_and_native_100 為通信標(biāo)識
// StandardMessageCodec() 為參數(shù)傳遞的 編碼方式
static const messageChannel = const BasicMessageChannel('flutter_and_native_100', StandardMessageCodec());
//發(fā)送消息
FuturesendMessage(Map arguments) async {
Map reply = await messageChannel.send(arguments);
//解析 原生發(fā)給 Flutter 的參數(shù)
int code = reply["code"];
String message = reply["message"];
//更新 Flutter 中頁面顯示
setState(() {
recive = "code:$code message:$message";
});
return reply;
}
觸發(fā)調(diào)用 ,分別在 三個 Button 的點(diǎn)擊事件中觸發(fā)
//Flutter 向 Android iOS 中基本的發(fā)送消息方式sendMessage({"method": "test", "ontent": "flutter 中的數(shù)據(jù)", "code": 100});
//用來實(shí)現(xiàn) Android iOS 主動觸發(fā) 向 Flutter 中發(fā)送消息
sendMessage({"method": "test2", "ontent": "flutter 中的數(shù)據(jù)", "code": 100});
//用來實(shí)現(xiàn) Flutter 打開 Android iOS 中的一個新的頁面
sendMessage({"method": "test3", "ontent": "flutter 中的數(shù)據(jù)", "code": 100});
1.2 實(shí)現(xiàn)實(shí)現(xiàn) Android 中監(jiān)聽方法并回調(diào)
Android 的 MainActivity 中注冊消息監(jiān)聽
flutter 更新之后 FlutterActivity 中沒有 getFlutterView() 方法
使用 getFlutterEngine().getDartExecutor().getBinaryMessenger()代替。
1.3 實(shí)現(xiàn)實(shí)現(xiàn) iOS 中監(jiān)聽方法 并回調(diào)
iOS 的 AppDelegate 中
#include "AppDelegate.h"#include "GeneratedPluginRegistrant.h"#import //TestViewController 是創(chuàng)建的一個 測試頁面#import "TestViewController.h"@implementation AppDelegate{ FlutterBasicMessageChannel* messageChannel;}- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; ... ... //FlutterBasicMessageChannel 與Flutter 之間的雙向通信 [self BasicMessageChannelFunction]; ... ... return [super application:application didFinishLaunchingWithOptions:launchOptions];}-(void) BasicMessageChannelFunction{ //獲取當(dāng)前的 controller FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController; // 初始化定義 // flutter_and_native_100 j messageChannel = [FlutterBasicMessageChannel messageChannelWithName:@"flutter_and_native_100" binaryMessenger:controller]; // 接收消息監(jiān)聽 [messageChannel setMessageHandler:^(id message, FlutterReply callback) { NSString *method=message[@"method"]; if ([method isEqualToString:@"test"]) { NSLog(@"flutter 調(diào)用到了 ios test"); NSMutableDictionary *dic = [NSMutableDictionary dictionary]; [dic setObject:@"[messageChannel setMessageHandler:^(id message, FlutterReply callback) 返回給flutter的數(shù)據(jù)" forKey:@"message"]; [dic setObject: [NSNumber numberWithInt:200] forKey:@"code"]; callback(dic); }else if ([method isEqualToString:@"test2"]) { NSLog(@"flutter 調(diào)用到了 ios test2"); NSMutableDictionary *dic = [NSMutableDictionary dictionary]; [dic setObject:@"[messageChannel sendMessage:dic] 返回給flutter的數(shù)據(jù)" forKey:@"message"]; [dic setObject: [NSNumber numberWithInt:200] forKey:@"code"]; //通過這個方法 iOS可以主動多次 向 Flutter 發(fā)送消息 [messageChannel sendMessage:dic]; }else if ([method isEqualToString:@"test3"]) { NSLog(@"flutter 調(diào)用到了 ios test3 打開一個新的頁面 "); TestViewController *testController = [[TestViewController alloc]initWithNibName:@"TestViewController" bundle:nil]; [controller presentViewController:testController animated:YES completion:nil]; } }]; }@end2 Android 、iOS 原生主動發(fā)送消息到 Flutter 中
2.1 實(shí)現(xiàn)Android 中主動調(diào)動調(diào)用方法
在MainActivity中,創(chuàng)建了 BasicMessageChannel?的實(shí)例 mMessageChannel,可以在MainActivity 中直接使用 mMessageChannel 實(shí)例來向 Flutter 中發(fā)送消息。
???private?void?channelSendMessage()?{ Toast.makeText(mContext, "flutter 調(diào)用到了 android test", Toast.LENGTH_SHORT).show(); //構(gòu)建參數(shù) Map<String, Object> resultMap = new HashMap<>(); resultMap.put("message", "reply.reply 返回給flutter的數(shù)據(jù)"); resultMap.put("code", 200); //向 Flutter 中發(fā)送消息 //參數(shù) 二可以再次接收到 Flutter 中的回調(diào) //也可以直接使用 mMessageChannel.send(resultMap) mMessageChannel.send(resultMap, new BasicMessageChannel.Reply<Object>() { @Override public void reply(Object o) { Log.d("mMessageChannel", "mMessageChannel send 回調(diào) " + o); } }); }在其他的 Activity 頁面中,我們就使用不到這個實(shí)例的,我這里的一個實(shí)現(xiàn) Android 中新建的Activity 頁面向 Flutter 中發(fā)送消息的方法 是廣播機(jī)制?
在 MainActivity 中注冊廣播,在廣播接收者中通過 BasicMessageChannel?的實(shí)例 mMessageChannel 來發(fā)送消息。
在 Android 中其他的頁面中 發(fā)送廣播到 MainActivity 中的廣播接收者中,這樣就實(shí)現(xiàn)了Android 中新建的Activity 頁面向 Flutter 中發(fā)送消息
public class MainActivity extends FlutterActivity { ... ... Handler mHandler = new Handler(Looper.myLooper()); private MainReceiver mMainReceiver; @Override protected void onDestroy() { super.onDestroy(); //注銷廣播 unregisterReceiver(mMainReceiver); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... ... //注冊廣播 mMainReceiver = new MainReceiver(); IntentFilter lIntentFilter = new IntentFilter("android.to.flutter"); registerReceiver(mMainReceiver, lIntentFilter); } public class MainReceiver extends BroadcastReceiver { public MainReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到自定義的廣播", Toast.LENGTH_SHORT).show(); mHandler.post(new Runnable() { @Override public void run() { Map resultMap2 = new HashMap<>(); resultMap2.put("message", "android 主動調(diào)用 flutter test 方法"); resultMap2.put("code", 200); if (mMessageChannel != null) { // 向Flutter 發(fā)送消息 mMessageChannel.send(resultMap2, new BasicMessageChannel.Reply() { @Override public void reply(Object o) { System.out.println("android onReply: " + o); } }); } } }); } }}2.2 實(shí)現(xiàn) Flutter 中監(jiān)聽調(diào)用方法
//創(chuàng)建 BasicMessageChannel // flutter_and_native_100 為通信標(biāo)識 // StandardMessageCodec() 為參數(shù)傳遞的 編碼方式 static const messageChannel = const BasicMessageChannel( 'flutter_and_native_100', StandardMessageCodec()); //接收消息監(jiān)聽 void receiveMessage() { messageChannel.setMessageHandler((result) async { //解析 原生發(fā)給 Flutter 的參數(shù) int code = result["code"]; String message = result["message"]; setState(() { recive = "receiveMessage: code:$code message:$message"; }); return 'Flutter 已收到消息'; }); }2.3 實(shí)現(xiàn) iOS 中主動調(diào)動調(diào)用方法
#include "AppDelegate.h"#include "GeneratedPluginRegistrant.h"#import #import "TestViewController.h"@implementation AppDelegate{ FlutterBasicMessageChannel* messageChannel;}- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; //注冊通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationFuncion:) name:@"ios.to.flutter" object:nil]; ... ... return [super application:application didFinishLaunchingWithOptions:launchOptions];} ... ... - (void)notificationFuncion: (NSNotification *) notification { // iOS 中其他頁面向Flutter 中發(fā)送消息通過這里 // 本頁中 可以直接使用 [messageChannel sendMessage:dic]; //處理消息 NSLog(@"notificationFuncion "); NSMutableDictionary *dic = [NSMutableDictionary dictionary]; if (messageChannel!=nil) { [dic setObject:@" [messageChannel sendMessage:dic]; 向Flutter 發(fā)送消息 " forKey:@"message"]; [dic setObject: [NSNumber numberWithInt:401] forKey:@"code"]; //主動向Flutter 中發(fā)送消息 [messageChannel sendMessage:dic]; } }- (void)dealloc { //單條移除觀察者 //[[NSNotificationCenter defaultCenter] removeObserver:self name:@"REFRESH_TABLEVIEW" object:nil]; //移除所有觀察者 [[NSNotificationCenter defaultCenter] removeObserver:self];}@end總結(jié)
以上是生活随笔為你收集整理的android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python三引号注释_python使用
- 下一篇: ad域不去用frs_Windows Se