#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 в начале для простоты.