Запуск собственного кода при запуске аварийных сигналов с помощью flutter

#flutter #dart #alarmmanager #android-alarms

#флаттер #дротик #alarmmanager #android-сигналы тревоги

Вопрос:

У меня есть пример, в котором реализован пример Android Alarm Manager с flutter, событие называется нормальным, однако я хочу, чтобы при срабатывании будильника выполнялся собственный код (Java или Kt). Пример: как только сработает аварийный сигнал даже в фоновом режиме или на заблокированном экране, приложение выполнит мой код на Java.

В родной Java мы создали класс, который наследуется от BroadcastReceiver и реализует метод onReceive, в Android Native я бы открыл свое приложение даже в фоновом режиме с помощью собственного кода.

Как я могу заставить flutter вызывать мой собственный код для запуска при срабатывании будильника?

Мой пример кода:

 import 'package:flutter/material.dart';
import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:android_intent/android_intent.dart';
import 'package:android_intent/flag.dart';
import 'package:platform/platform.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Alarme app',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Alarme'),
      debugShowCheckedModeBanner: false,
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

void _openLinkInGoogleChrome() {
  print('entered');
  if (const LocalPlatform().isAndroid) {
  // **run Native code java here that implemented onReceive on class .java or .kt !!!**
  }
}

class _MyHomePageState extends State<MyHomePage> {
  void adicionarAlarme(BuildContext context) async {
    await AndroidAlarmManager.periodic(
        const Duration(seconds: 3), 0, _openLinkInGoogleChrome);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Clique no botão abaixo para adicionar um alarme',
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => adicionarAlarme(context),
        tooltip: 'Adicionar alarme',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

 

Комментарии:

1. MethodChannels — это то, что вы ищете

2. Я поищу об этом

3. Это не так просто, как ответ, который можно написать здесь. Вот почему я не опубликовал его. Вы должны понять, как это работает. Однажды, когда вы все сделаете правильно, это станет так просто. Я очень часто использую его во многих проектах.

4. Ссылка на эту ссылку справа: flutter.dev/docs/development/platform-integration/ … ?

5. ДА. Но эта документация такая скучная ! Вы пропускаете всю эту часть iOS в начале для простоты.