android - 如何在后台检测调用并在原生代码和 dart 代码之间架起一座桥梁
问题描述
当收到来电时,我正在尝试从飞镖代码发送通知。我无法在 android 本机代码和颤振代码之间架起一座桥梁。问题是我需要这个功能在后台工作。我会这样描述这个循环:
- Flutter android原生代码必须在后台检测调用
- 本机代码必须从 Flutter dart 代码中调用某个类
- 此类在数据库中查找有关调用者的某些信息
- 找到它后,它必须弹出一个包含某些详细信息的通知。
我设法完成了第 3 部分和第 4 部分,但我需要第 1 部分和第 2 部分的帮助。
我试图弄清楚这个给定的例子,但它太复杂了
我找到了这个方法来检测来电,但我无法将它附加到 mainActivity 类以及如何第 2 部分
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.widget.Toast;
import android.telephony.TelephonyManager;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
telephony.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// I think this is the part, where I should call my dart class.
}
},PhoneStateListener.LISTEN_CALL_STATE);
}
}
问题是如何正确检测调用以及如何从 android 本机代码调用 dart 类?
解决方案
您可以在 native 和 dart 之间创建 MethodChannel。这是示例代码:
String channel = "my.data";
MethodChannel methodChannel = new MethodChannel(Objects.requireNonNull(getFlutterEngine()).getDartExecutor().getBinaryMessenger(), channel);
final HashMap<String, String> map = new HashMap<>();
map.put("yourvar", "myvar");
methodChannel.setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if (call.method.equals("onFinish")) {
finish();
}
}
});
methodChannel.invokeMethod("callMyFunction", map);
在你的 dart 文件中写下这段代码,
static const platform = const MethodChannel('my.data"');
_MyPageState() {
platform.setMethodCallHandler(_receiveFromNative);
}
Future<void> _receiveFromNative(MethodCall call) async {
try {
print(call.method);
if (call.method == "callMyFunction") {
print(call.arguments['yourvar']);
//write your code here
}
} on PlatformException catch (e) {}
}
你也可以参考这个文档
推荐阅读
- swift - 在 SwiftUI 中刷新枚举案例的 VStack
- c# - 消息:订阅验证请求失败。通知端点必须以 200 OK 响应验证请求
- android - 从 android 中的 SevenZip 库的选定文件路径中获取 archiveFile 名称
- python - 用平均值替换每行的最大值
- node.js - 跨服务器的 TestCafe 负载平衡命令
- nestjs - NestJs 一个具有关系的 Post 请求
- python - 如何在python中映射另一列的值
- batch-file - 批处理文件 IF 命令未正确评估
- snowflake-cloud-data-platform - 是否可以创建数据交换并与读者帐户共享?
- javascript - 通过循环键数组创建两个或多个 S3 预签名 URL?