Flutter与Android的事件监听(EvenChannel)

1,153 阅读1分钟
flutter端的调用代码
EventChannel _eventChannel=new EventChannel('samples.flutter.io/charging');
  Future<void> event(Function(Object data) function)async{
    _eventChannel.receiveBroadcastStream().listen((data){
      function(data);
      print("事件监听=========》"+data.toString());
    });
  }

android端的代码

第一步,需要一个通道名

private final String CHARGING_CHANNEL = "samples.flutter.io/charging";

第二步,创建监听对象

//事件接受对象
private EventChannel.EventSink eventSink = null;
private EventChannel.StreamHandler streamHandler = new EventChannel.StreamHandler() {
        //事件监听
        @Override
        public void onListen(Object o, EventChannel.EventSink sink) {
            eventSink = sink;
            //监听手机充电状态
            context.registerReceiver(
                    createChargingStateChangeReceiver(eventSink), new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
            //sink.success("测试一下");
        }

        //取消监听
        @Override
        public void onCancel(Object o) {
            eventSink = null;
        }
    };

第三步,注册通道--此处代码是写在构造函数中,并不是一定要写在构造函数中,

FlutterPlugin(FlutterActivity activity, MethodChannel channel, Registrar registrar) {
        this.activity = activity;
        //CHARGING_CHANNEL通道名
        EventChannel eventChannel = new EventChannel(registrar.messenger(), CHARGING_CHANNEL);
        //设置监听对象
        eventChannel.setStreamHandler(streamHandler);
    }

监听手机充电状态


private BroadcastReceiver createChargingStateChangeReceiver(final EventChannel.EventSink events) {
        return new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                        status == BatteryManager.BATTERY_STATUS_FULL;
                String message = "null";
                switch (status) {
                    case BatteryManager.BATTERY_STATUS_CHARGING:
                        message = "充电中";
                        break;
                    case BatteryManager.BATTERY_STATUS_DISCHARGING:
                        message = "放电中";
                        break;
                    case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
                        message = "未充电";
                        break;
                    case BatteryManager.BATTERY_STATUS_FULL:
                        message = "已充满";
                        break;
                }
                events.success(message);
            }
        };
    }

参考自 juejin.cn/post/684490…