Reputation: 111
I have written the code below (fully runnable), when I run the app a notification is displayed but the AlarmManager doesn't work as expected. It doesn't display a notification every minute as I told him... How can I fix it? Thx in advance and keep coding with <3
class _MyHomePageState extends State<MyHomePage>
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
var initializationSettings;
var initializationSettingsAndroid;
@override
Widget build(BuildContext context)
{
initializationSettingsAndroid = new AndroidInitializationSettings("@mipmap/ic_launcher");
initializationSettings = InitializationSettings(initializationSettingsAndroid, null);
flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification);
createTimer();
return Scaffold
(
appBar: AppBar
(
title: Text(widget.title),
),
body: Container()
);
}
void createTimer() async
{
final int alarmID = 0;
showNotificationWithDefaultSound();
await AndroidAlarmManager.initialize();
await AndroidAlarmManager.periodic(const Duration(minutes: 1), alarmID, showNotificationWithDefaultSound);
}
Future showNotificationWithDefaultSound() async
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('idNotification', 'AppName', 'Description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(0, 'New Notification', 'This is the text of the notification', platformChannelSpecifics, payload: 'Hi guys and girls!!');
}
Future onSelectNotification(String payload) async
{
showDialog(context: context, builder: (_)
{
return new AlertDialog(title: Text("PayLoad"), content: Text("Payload : $payload"));
});
}
}
Upvotes: 0
Views: 5204
Reputation: 111
Finally I found a solution... Here is the full example.
https://github.com/Anon-65535/SimpleBackgroundTimer
First of all, make main()
"async" then initialise AndroidAlarmManager
;
void main() async
{
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(MainClass());
}
Create alarmManager.dart
inside your package, the class inside it is called NotificationManager
;
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class NotificationManager
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
AndroidInitializationSettings initializationSettingsAndroid;
IOSInitializationSettings initializationSettingsIOS;
InitializationSettings initializationSettings;
void initNotificationManager()
{
initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
initializationSettingsIOS = new IOSInitializationSettings();
initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
void showNotificationWithDefaultSound(String title, String body)
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics);
}
}
Then create your callback out of any class in your favourite .dart
file (the callback will be called from a background thread created by AndroidAlarmManager
);
alarmCallback()
{
NotificationManager n = new NotificationManager();
n.initNotificationManager();
n.showNotificationWithDefaultSound("Prova", "Prova");
print("[*] Called from AlarmManager");
return;
}
Finally create the background thread from AlarmManager in this way (import in this .dart
file the .dart
file where the callback is defined:
AndroidAlarmManager.oneShotAt(DateTime.now().add(Duration(seconds: 10)),
0,
alarmCallback,
exact: true,
allowWhileIdle: true,
wakeup: true,
rescheduleOnReboot: true,
alarmClock: true);
//This will call your callback in 10 seconds from now (Datetime.now())
Keep coding with <3
Upvotes: 5